Разрешить параллелизм во время обновления таблицы в Sybase - PullRequest
0 голосов
/ 20 октября 2011

У меня есть процедура в Sybase со следующим кодом.

begin transaction get_virtual_acc

    UPDATE store_virtual_acc SET isProc = 1, Uid = @uid, DateReserv = getdate()  
    from store_virtual_acc (index idx_id) WHERE id = (SELECT min(id) FROM store_virtual_acc (index idx_uid) where  Uid = null and isProc = null)  

commit transaction get_virtual_acc 

Проблема в том, что при одновременном вызове процедуры несколько пользователей могут получить одинаковый min (id) и обновить одну и ту же строку в таблице с другим значением @uid. Результатом является искажение данных. Необходимо добиться результата: если строка уже выбрала для обновления одного пользователя, другой не сможет его выбрать. Стол имеет тип замка datarows.

Пытался использовать блокировку на уровне транзакции следующим образом установить уровень изоляции транзакции 3 до начала транзакции, но приложение, вызывающее процедуру, получает исключение java.sql.SQLException: Ваша серверная команда (идентификатор семьи № 0, идентификатор процесса № 530) обнаружила тупиковую ситуацию. Пожалуйста, повторите команду.

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 20 октября 2011

Попробуйте что-то вроде этого:

begin transaction get_virtual_acc

UPDATE store_virtual_acc SET isProc = 1, Uid = @uid, DateReserv = getdate()  
from store_virtual_acc (index idx_id) WHERE id = (SELECT min(id) FROM store_virtual_acc (index idx_uid) holdlock where  Uid = null and isProc = null )  

commit transaction get_virtual_acc 

Ключевое слово: Holdlock

...