我在 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 更新表中的同一行。结果是数据失真。需要达到一个结果,如果该行已经选择更新单个用户,其他用户不能选择它。表具有锁定类型的数据行。
尝试使用事务级锁定,如下所示在事务开始之前设置事务隔离级别 3,但调用过程的应用程序获取异常 java.sql.SQLException:您的服务器命令(系列 ID #0,进程 ID #530)遇到死锁情况。请重新运行您的命令。
如果有任何帮助,我将不胜感激。