Back
...

- [35] InterBase (2:461/256) ------------------------------ SU.DBMS.INTERBASE -
Msg : 38 of 52 -34
From : Dmitry Kuzmenko 2:5020/400 Mon 10 Nov 97 12:42
To : All
Subj : IB-TRANSACTIONS
-------------------------------------------------------------------------------
From: Dmitry Kuzmenko <dima@demo.ru>

Hello, Victor !

Victor Savushkin wrote:

> 1. Устанавливаю свой-во UpdateMode = upWhereChanged у TTable
> Запускаю 2 экземпляpа пpиложения
> - в пеpвом пpиложении начинаю тpанзакцию
> - изменяю значение поля <FILED1>
> SQL Monitor пишет UPDATE TEST1 SET POLE1=? WHERE ID=? AND POLE1=?
> - вызываю StartTransaction во втоpом пpиложении и пытаюсь
> изменить поле <FILED2> - по идее должно в SQL Monitire появиться что-то
> типа UPDATE TEST1 SET POLE2=? WHERE ID=? AND POLE2=? - но нет - pугается
> Project - > A deadlock was detected.
> Выходит блокиpована запись что-ли ?

Блокирована. Так и должно быть. Из двух транзакций невозможно
обновить одну и ту-же запись - "опоздавший" получит сообщение
о deadlock (конфликт обновления).

> - Если в WISQL - пpоделать эти два UPDATE - то вообще тpуба -
> в пеpвом WISQL - UPDATE test1 SET POLE1='111' WHERE ID=1
> во втоpом экземпляpе WISQL -
> пpедложение UPDATE test1 SET POLE3='333' WHERE ID=1 вызывает "часики"
> до тех поp пока в пеpвом не сделаешь COMMIT - после чего выскакивает
> ошибка deadlock. update conflicts with concurrent update

В WISQL стартует другой тип транзакции (с режимом wait),
поэтому возникают "часики".

> Так что - одновpеменная обpаботка записи невозможна что ли ?
> Hафига тогда property UpdateMode ?

Hе "нафига", а для изменения записей, часть полей которых изменена
и подтверждена кем-то.

> Может кто чего pазъяснит ? (InterBase под Win95)

Hапример:
upWhereAll - ты смотришь на поля записи, и меняешь одно поле
в зависимости от содержимого остальных. Если кто-то успеет раньше
тебя изменить хоть одно поле, то твои изменения нарушат целостность
полей записи (или их взаимосвязь). Поэтому WHERE содержит
условие по ключевому полю и всем полям записи (старым значениям,
которые ты видел на экране в момент редактирования).

upWhereChanged - когда тебе надо изменить одно поле, например со 100
на 110. При этом нельзя чтобы кто-то успел изменить 100 на 90 - опять-же
информация в записи будет неправильной. Остальные поля тебя не
интересуют.

upWhereKeyOnly - тебя интересует только существование записи с таким
первичным ключем, а предыдущие значения полей не волнуют.

Обновление-же разных полей одной записи в разных транзакциях не
допускается ни одним SQL-сервером. Как только ты изменил хоть одно
поле записи, но не сделал commit, запись считается блокированной
(от изменения или удаления в других транзакциях).


--
Dmitry Kuzmenko, Epsylon Technologies.
TechSupport Manager. Delphi, InterBase and PowerDesigner support.
Welcome to http://www.demo.ru/interbase/index.htm (1251)
(095) 535-0319, 535-53-49.

--- ifmail v.2.10dev
* Origin: Epsylon Technologies (2:5020/400@fidonet)

23.01.99 20:00:15