所以我有一个像这样的存储过程(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
我不希望两个存储过程读取相同的值。换句话说,读取和更新应该是原子的。 这段代码是这样做的吗?如果不是我该怎么办?
最佳答案
是的,它们是原子的,但这并不意味着您会在这里得到您想要的行为!您需要关注的属性是隔离。
要实现所需的排除,您需要对单个值 mutually exclusive 进行 SELECT
操作。您可以通过请求 Update
锁来做到这一点(确保可以通过索引找到 WHERE
谓词,以避免锁定不必要的额外行)
SELECT * FROM foo WITH(ROWLOCK,UPDLOCK) WHERE bar='baz'
请注意,此锁定将一直保持到您的事务提交为止,但不会在关键部分结束时释放,但如果您无论如何更新了值,情况总是如此。
关于sql-server - sql server事务是原子的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7430525/