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)
我希望没有两个存储过程读取相同的值.换句话说,读取和更新应该是原子的.这段代码做到了吗?如果不是我该怎么办?
是的,它们是原子的,但这并不意味着你会得到你想要的行为!你需要看的属性是隔离.
要实现所需的排除,您需要SELECT对单个值进行相互排斥的操作.您可以通过请求Update锁定来执行此操作(确保WHERE可以通过索引找到谓词以避免锁定不必要的额外行)
SELECT * FROM foo WITH(ROWLOCK,UPDLOCK) WHERE bar='baz'
Run Code Online (Sandbox Code Playgroud)
请注意,此锁定将一直保持到您的事务提交为止,但不会在关键部分结束时释放,但如果您已更新该值,则始终是这种情况.
| 归档时间: |
|
| 查看次数: |
4513 次 |
| 最近记录: |