работа с wait транзакцией
Добавлено: 02 мар 2010, 12:44
тестировалось на версии 2.5.0.25920
задача: реализовать уникальное выполнение дейсвия "1" клиентами.
таблица:
C
процедура:
в программе есть блок:
Параметры транзакции: nowait rec_version read_committed
при работе двух клиентов "блокировка-ожидание" работает.
запускаем третий, зависание на 30с. и получаем на одном из процессов ошибку:
Deadlock.
Violation of PRIMARY or UNIQUE KEY constraint «PK_LOCKS» on table “LOCKS”.
At procedure ‘DO_LOCK’.
снимаем задачу с ошибкой, оставшиеся процессы продолжают работать так как "требуется".
ВОПРОС: я не верно работаю с wait-транзакцией или баг?
задача: реализовать уникальное выполнение дейсвия "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;
при работе двух клиентов "блокировка-ожидание" работает.
запускаем третий, зависание на 30с. и получаем на одном из процессов ошибку:
Deadlock.
Violation of PRIMARY or UNIQUE KEY constraint «PK_LOCKS» on table “LOCKS”.
At procedure ‘DO_LOCK’.
снимаем задачу с ошибкой, оставшиеся процессы продолжают работать так как "требуется".
ВОПРОС: я не верно работаю с wait-транзакцией или баг?