Select 在Sybase中更新表时解决一致性问题

Select 在Sybase中更新表时解决一致性问题,select,transactions,sybase,isolation,Select,Transactions,Sybase,Isolation,我在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) whe

我在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 在事务开始之前,但是调用过程get exception的应用程序 java.sql.SQLException:您的服务器命令(family id#0,process id#530)遇到死锁情况。请重新运行您的命令


如果有任何帮助,我将不胜感激。

尝试以下方法:

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