sql-server - sql server事务是原子的

标签 sql-server atomic

所以我有一个像这样的存储过程(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/

相关文章:

mysql - 将mysql插入语句转换为sql server插入语句?

ios - Swift 中的线程安全

ruby - Redis 管道作为原子

java - AtomicInteger.compareAndSet 返回原始值,而不是 boolean 值

java - AtomicXXX.lazySet(...) 就 happens before edges 而言

c++ - Cuda 以原子方式执行操作

sql-server - 我可以安排的数据库比较工具

sql-server - 将SQL数据库从2014版本迁移到2012版本 - mvc codefirst

c# - 从 C# 获取 sql 数据的最佳方法是什么

sql-server - 无法获取更改日志锁。当前被 'UserName' (IpAddress) 自日期时间锁定