【问题标题】:SQL Server atomic incrementSQL Server 原子增量
【发布时间】:2013-11-07 12:44:36
【问题描述】:

我需要更新我的一个表的几行作为原子操作。

更新涉及增加某些行的 int 列中的一些值。我需要将几行中的值作为单个操作递增。

最好的方法是什么?

为我回答这个问题归结为回答以下两个:

  • 如果我使用LINQ to SQL,如何实现增量的原子性 操作(我是使用事务,还是有更好的方法)?
  • 存储过程是否以原子方式执行(如果我在 DB 上调用该过程)?

我正在使用 SQL Server 使用 C#。

【问题讨论】:

  • 单个 UPDATE 语句所做的任何更改都是原子的,即使它们影响多行。您可以编写 WHERE 子句以将更新限制为仅要更新的行。编写单个 UPDATE 语句有问题吗?您如何选择要更新的记录?
  • 我在其中一个表中存储了一个树结构,我需要进行从节点到树根的链式更新。我有一列通过 RowID 引用同一个表(我知道这不是树的最佳结构,但这现在并不重要)。我可以执行一次更新,我知道这是原子的,但我的问题是最好的方法是什么(以及如何使用 LINQ to SQL 进行原子增量)。
  • @PanagiotisKanavos 如果他正在执行多个更新语句怎么办??
  • 如果您进行更改并拨打SubmitChanges 电话,所有事情都发生在一个事务中。还是我错过了你的意思?
  • 是的,但是如果你增加一个值然后提交它不会作为增量提交,而是作为新值提交,这意味着它不会提供增量操作的原子性。

标签: c# sql-server stored-procedures linq-to-sql concurrency


【解决方案1】:

在 SQL Server 中,不同操作之间的原子性是通过使用Explicit Transactions 实现的,其中用户使用关键字BEGIN TRANSACTION 显式启动事务,并且一旦所有操作都完成且没有任何错误,您可以使用以下方式提交事务关键字COMMIT TRANSACTION,如果出现错误/异常,您可以使用关键字ROLLBACK TRANSACTION在正在进行的事务中的任何位置撤消工作
提前写策略
SQL Server 使用Write Ahead Strategy 来确保事务的原子性和数据的持久性,当我们对数据进行任何更改/更新时,SQL Server 会采取以下步骤

  1. 将数据页加载到缓冲区缓存中。
  2. 更新缓冲区中的副本。
  3. 在日志缓存中创建日志记录。
  4. 通过检查点进程将日志记录保存到磁盘。
  5. 将数据保存到磁盘。

因此,如果您决定回滚交易,则在所有这些步骤的过程中的任何地方。您在磁盘上的实际数据保持不变。
我的建议

BEGIN TRY

       BEGIN TRANSACTION 
        ------ Your Code Here ------


        ---- IF everything Goes fine (No errors/No Exceptions)

       COMMIT TRANSACTION

END TRY

BEGIN CATCH 

         ROLLBACK TRANSACTION   --< this will ROLLBACK any half done operations 


         -- Your Code here ---------

END CATCH

【讨论】:

  • 只有在需要隔离多个语句时才需要事务。单个 UPDATE 不需要显式事务。我不明白这一切与这个问题有什么关系
  • “我需要更新我的一个表的几行作为原子操作。”这是这个问题的第一行,将多个更新包装在一个显式的 BEGIN TRAN ---- COMMIT TRAN 中将解决他正在寻求帮助的问题。现在好像和这个问题有关???所有更新都提交或没有:)
  • 没有。他要的是陈述,或者是 L2S 调用
【解决方案2】:

我找到了答案:不能直接通过LINQ to SQL实现增量。但是,存储过程可以从 LINQ 中调用,并且可以在那里实现增量。

我的解决方案是创建一个存储过程,该过程将在事务的单个 while 循环中执行必要的更新。这样,所有更新都作为单个原子操作执行。

UPDATE 语句本身是原子的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多