Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.25;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
1-81817
Nick2000
2003-08-13 10:22
2003.08.25
MS Word


14-81926
Yanis
2003-08-07 02:51
2003.08.25
Где взять статьи по 3D Max в инете?


8-81842
zorg2003
2003-04-26 00:43
2003.08.25
MMSYSTEM some questions


1-81678
ki11er
2003-08-11 16:26
2003.08.25
Можно ли подключить исходник rtl к проекту?


9-81521
anatoly1
2003-02-24 02:22
2003.08.25
Как выполнить иницыализацию двумерного массива