Страница 1 из 1

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

Добавлено: 02 мар 2010, 12:44
zigorzn
тестировалось на версии 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-транзакцией или баг?

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

Добавлено: 02 мар 2010, 13:24
Dimitry Sibiryakov
zigorzn писал(а):задача: реализовать уникальное выполнение дейсвия "1" клиентами.

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

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

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

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

Добавлено: 02 мар 2010, 13:40
zigorzn
неверно набрал текст.
"Параметры транзакции: wait rec_version read_committed"

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

Добавлено: 03 мар 2010, 01:33
kdv
и зачем тут wait?
при работе двух клиентов "блокировка-ожидание" работает.
и как работает?

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

Добавлено: 03 мар 2010, 11:35
zigorzn
работает. Если "заблокировано", то второй ждет.

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

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

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

Добавлено: 04 мар 2010, 09:39
zigorzn
Когда двое, тогда они друг друга ждут . Как только появляется третий , то "выскакивает" ошибка.

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

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

Добавлено: 04 мар 2010, 12:35
kdv
Когда двое, тогда они друг друга ждут . Как только появляется третий , то "выскакивает" ошибка.
опция 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.
кто-то из нас что-то делает не так, или говорит не про те параметры транзакций.