Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Вниз

Помогите разобраться с транзакциями!   Найти похожие ветки 

 
paxer   (2003-07-30 10:47) [0]

Наверное я чего-то не понимаю. Если можно, разъясните в чем я ошибаюсь. Код примерно следующий (Yaffil Personal, компоненты доступа - Zeos).
Проблема в следующем. Одной транзакцией читаю таблицу, затем пишу другой транзакцией, после снова читаю. Если в пишущей в параметре стоит nowait - все нормально. Если же ставлю wait - данные не изменяются. Хотя по логике (по крайней мере моей) во втором случае если запись заблокирована сервер должен ждать разблокировки.
Код:
Читающая транзакция:
trRead:=TZIbSqlTransact.Create(nil);
trRead.Database:=Database1;
trRead.Params.Add("read_committed rec_version nowait");
qRead.Transaction:=trRead;
Пишущая транзакция:
trSave:=TZIbSqlTransact.Create(nil);
trSave.Database:=Database1;
trSave.Params.Add("write concurrency nowait");
qSave.Transaction:=trSave;

Упрощенный пример кода:
//Читаю
qRead.Open();
q.Close; q.Transaction.Commit; //(вот незнаю, надо ли делать коммит?)
//Пишу
qSave.Add("UPDATE...");
q.ExecSql;
q.Transaction.Commit();
//Читаю
qRead.Open();
q.Close; q.Transaction.Commit;

Буду очень благодарен, если кто просветит по этому поводу.


 
Zacho   (2003-07-30 10:50) [1]

По этому вопросу все хорошо описано в http://www.ibase.ru/devinfo/ibtrans.htm


 
paxer   (2003-07-30 11:42) [2]

Почитал:
WAIT / NO WAIT (константы wait и nowait) - Режимы обработки конфликтов блокировок. Если транзакция стартует в режиме WAIT (по умолчанию), и при выполнении операции обнаруживается конфликт, то операция "замораживается" до разрешения конфликта. В режиме NO WAIT сообщение о конфликте выдается приложению немедленно (возникает ошибка), а операция, которая привела к конфликту, отменяется. В случае взаимоблокировки двух wait-транзакций сервер автоматически обнаруживает эту ситуацию, и разблокирует одну из транзакций (как будто она стартовала как nowait) через интервал времени, определенный в IBCONFIG параметром DEADLOCK_TIMEOUT, который по умолчанию равен 10 секундам.
///////////////////////
В моем случае при параметре nowait обновление происходит. При параметре wait - нет. Никаких сообщений об ошибке.
Идет вразрез с выше описанным. Должно быть либо наоборот, либо должно быть сообщение об ошибке.


 
Zacho   (2003-07-30 12:01) [3]


> paxer (30.07.03 11:42)

Возможно, какой-то баг в Zeos ? Например, просто "проглатывается" exception. Если есть исходники Zeos, попробуй потрассировать.
А такое происходит в любом случае, или только тогда, когда запись заблокирована ?
Попробуй смоделировать эту ситуацию в IBExpert или IBConsole (или любом другом инструменте) - по крайней мере поймешь, в твоей программе дело или в чем-то другом.


 
paxer   (2003-07-30 12:32) [4]

Если бы "проглатывается" exception, то как тогда происходило бы изменение?
Вот и возникает у меня мысль - либо я чего-то не понял, либо Zeos как-то неправильно преобразовывает параметры транзакции.
При использовании пустых параметров транзакций все работает.
Попробую вынести это действие в отдельную программу и там снова потестировать.


 
paxer   (2003-07-30 12:42) [5]

Спасибо Zacho © , программа заработала. К сожалению, даже не знаю от чего (что пугает). Вроде бы ничего не менял (попереставлял взад-вперед параметры, вернул все наместо).


 
Zacho   (2003-07-30 13:34) [6]


> paxer (30.07.03 12:32)
> Если бы "проглатывается" exception, то как тогда происходило
> бы изменение?

Да у меня была такая мысль - возникает lock conflict, серевер естественно выдает exception, но в случае с WAIT этот exception проходит нормально, а с NOWAIT - "проглатывается" где-то в недрах Zeos, и получается, что вроде бы и конфликта не было, и UPDATE не прошел.

> paxer (30.07.03 12:42)
>программа заработала. К сожалению, даже
> не знаю от чего (что пугает).

Правильно пугает :-) Попробуй все-таки разобраться, а то хрен знает когда еще вылезет :)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
1-81835
Miralex
2003-08-11 11:20
2003.08.25
Вопрос по формам?


4-82003
Alexander666
2003-06-18 22:06
2003.08.25
Вопрос по работе с мышью


1-81654
Yuliya
2003-08-12 10:22
2003.08.25
директория


3-81584
Хозявин М
2003-07-31 21:50
2003.08.25
Запись БД на диск


1-81685
lynx
2003-08-11 15:11
2003.08.25
Run-time created объекты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский