работа с wait транзакцией

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
zigorzn
Сообщения: 27
Зарегистрирован: 03 фев 2008, 09:16

работа с wait транзакцией

Сообщение zigorzn » 02 мар 2010, 12:44

тестировалось на версии 2.5.0.25920

задача: реализовать уникальное выполнение дейсвия "1" клиентами.

таблица:
C

Код: Выделить всё

REATE TABLE LOCKS (ID  VARCHAR(20) NOT NULL);
ALTER TABLE LOCKS ADD CONSTRAINT PK_LOCKS PRIMARY KEY (ID);
процедура:

Код: Выделить всё

create or alter procedure DO_LOCK (ID varchar(20))
as
begin
  UPDATE OR INSERT INTO LOCKS (ID) VALUES (:ID) MATCHING (ID);
end

в программе есть блок:

Код: Выделить всё

    repeat
      Lock('1');                 // start transaction; execute procedure DO_LOCK(‘1’);
      Sleep(Round(Random*1000));
      UnLock('1');               // Rollback;      
    until false;
Параметры транзакции: nowait rec_version read_committed

при работе двух клиентов "блокировка-ожидание" работает.
запускаем третий, зависание на 30с. и получаем на одном из процессов ошибку:
Deadlock.
Violation of PRIMARY or UNIQUE KEY constraint «PK_LOCKS» on table “LOCKS”.
At procedure ‘DO_LOCK’.
снимаем задачу с ошибкой, оставшиеся процессы продолжают работать так как "требуется".

ВОПРОС: я не верно работаю с wait-транзакцией или баг?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: работа с wait транзакцией

Сообщение Dimitry Sibiryakov » 02 мар 2010, 13:24

zigorzn писал(а):задача: реализовать уникальное выполнение дейсвия "1" клиентами.

Параметры транзакции: nowait rec_version read_committed

ВОПРОС: я не верно работаю с wait-транзакцией или баг?
А где тут wait-транзакция?

Может, стоит-таки прочитать это и это?..

zigorzn
Сообщения: 27
Зарегистрирован: 03 фев 2008, 09:16

Re: работа с wait транзакцией

Сообщение zigorzn » 02 мар 2010, 13:40

неверно набрал текст.
"Параметры транзакции: wait rec_version read_committed"

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: работа с wait транзакцией

Сообщение kdv » 03 мар 2010, 01:33

и зачем тут wait?
при работе двух клиентов "блокировка-ожидание" работает.
и как работает?

zigorzn
Сообщения: 27
Зарегистрирован: 03 фев 2008, 09:16

Re: работа с wait транзакцией

Сообщение zigorzn » 03 мар 2010, 11:35

работает. Если "заблокировано", то второй ждет.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: работа с wait транзакцией

Сообщение hvlad » 03 мар 2010, 12:02

zigorzn писал(а):работает. Если "заблокировано", то второй ждет.
Ну так и 3-ий и все остальные тоже ждут. Что не так ?

zigorzn
Сообщения: 27
Зарегистрирован: 03 фев 2008, 09:16

Re: работа с wait транзакцией

Сообщение zigorzn » 04 мар 2010, 09:39

Когда двое, тогда они друг друга ждут . Как только появляется третий , то "выскакивает" ошибка.

будем искать другие способы.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: работа с wait транзакцией

Сообщение kdv » 04 мар 2010, 12:35

Когда двое, тогда они друг друга ждут . Как только появляется третий , то "выскакивает" ошибка.
опция wait, concurrency.
выполняю update в приложении1, не делаю commit.
выполняю update в приложении2 - повисает
выполняю update в приложении3 - повисает
причем, если в приложении1 сделать rollback, приложение2 отвисает, а приложение3 остается висеть.

опция wait, read_committed, rec_version
выполняю update в приложении1, не делаю commit.
выполняю update в приложении2 - повисает
выполняю update в приложении3 - повисает

все точно так же. делаю rollback в первом - второе висит и т.д.
если вместо rollback делаю commit, что в snapshot что в read_committed - ОБА висящих до этого приложения получают сообщение

Код: Выделить всё

deadlock.
update conflicts with concurrent update.
concurrent transaction number is 361.
кто-то из нас что-то делает не так, или говорит не про те параметры транзакций.

Ответить