У меня есть процедура в 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) обнаружила тупиковую ситуацию. Пожалуйста, повторите команду.
Буду признателен за любую помощь.