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