задача: реализовать уникальное выполнение дейсвия "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-транзакцией или баг?