SQL Server原子增量

时间:2013-11-07 12:44:37

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

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

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

最好的方法是什么?

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

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

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

2 个答案:

答案 0 :(得分:0)

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

  1. 将数据页加载到缓冲区缓存中。
  2. 更新缓冲区中的副本。
  3. 在日志缓存中创建日志记录。
  4. 通过检查点进程将日志记录保存到磁盘。
  5. 将数据保存到磁盘。
  6. 如果您决定ROLLBACK事务,那么在所有这些步骤的过程中的任何地方。您的磁盘上的实际数据保持不变 我的建议

    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
    

答案 1 :(得分:-1)

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

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

UPDATE语句本身就是原子的。