在Sybase中更新表期间解决并发问题

时间:2011-10-20 07:51:17

标签: 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) where  Uid = null and isProc = null)  

commit transaction get_virtual_acc 

问题在于,当多个用户多次调用该过程时,他们可以接收相同的min(id)并使用不同的值@uid更新表中的相同行。结果是数据失真。有必要实现一个结果,如果该行已经选择更新单个用户,则另一个不能选择它。表具有锁定类型数据行。

尝试使用事务级锁定,如下所示 设置事务隔离级别3 在事务开始之前,但是应用程序会调用该过程获得异常 java.sql.SQLException:您的服务器命令(系列ID#0,进程ID#530)遇到死锁情况。请重新运行您的命令。

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

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

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