Форум: "Базы";
Текущий архив: 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