是sql server transaction atomic

ren*_*ren 7 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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ith 6

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

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

SELECT * FROM foo WITH(ROWLOCK,UPDLOCK) WHERE bar='baz'
Run Code Online (Sandbox Code Playgroud)

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