是sql server transaction atomic

时间:2011-09-15 12:07:47

标签: sql-server atomicity

所以我有一个类似这样的存储过程(sql server 2008 r2)

BEGIN TRAN
BEGIN TRY


   //critical section
    select value        
    update value
       //end of critical section


    COMMIT
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK
END CATCH

我希望没有两个存储过程读取相同的值。换句话说,读取和更新应该是原子的。 这段代码做到了吗?如果不是我该怎么办?

1 个答案:

答案 0 :(得分:6)

是的,他们是原子的,但这并不意味着你会得到你想要的行为!您需要查看的属性是隔离。

要实现您需要的排除,您需要对单个值mutually exclusive进行SELECT操作。您可以通过请求Update锁定来执行此操作(确保可以通过索引找到WHERE谓词以避免锁定不必要的额外行)

SELECT * FROM foo WITH(ROWLOCK,UPDLOCK) WHERE bar='baz'

请注意,此锁定将一直保留,直到您的事务提交但未在关键部分结束时释放,但如果您已更新该值,则始终是这种情况。