3

我需要将其中一张表的几行更新为原子操作。

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

最好的方法是什么?

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

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

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

4

2 回答 2

0

在 SQL Server 中,不同操作之间的原子性是通过使用来实现的Explicit Transactions,其中用户使用关键字显式启动事务BEGIN TRANSACTION,一旦所有操作完成且没有任何错误,您就可以使用关键字提交事务COMMIT TRANSACTION,以防出错/例外您可以通过使用关键字ROLLBACK TRANSACTION
Write Ahead Strategy
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
于 2013-11-07T13:37:37.247 回答
-1

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

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

UPDATE 语句本身是原子的。

于 2013-11-12T19:50:13.270 回答