c# - SQL Server 原子增量

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

我需要以原子操作的形式更新其中一张表的几行。

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

执行此操作的最佳方法是什么?

对我来说,回答这个问题归结为回答以下两个问题:

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

我正在使用 C# 和 SQL Server 工作。

最佳答案

在 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

关于c# - SQL Server 原子增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836329/

相关文章:

stored-procedures - MongoDB 存储过程等价物

set 语句中的 MySQL 脚本

c# - Unity 3D - 没有旋转轴的旋转游戏对象

c# - Wix - 在哪里安装 Windows 功能

sql-server - SQL 服务器 2008 : how does NOLOCK works for CTE?

node.js - 向我的 sequelize 查询添加限制会引发错误

mysql - 我正在尝试在 mysql phpmyadmin 中创建一个存储过程

c# - 在 Intellisense 中将属性/函数设为粗体

c# - 如何从用户控件更改 MasterPage 中的控件值?

c# - 使用 Linq 更新 SQL Server 数据库的更好方法是什么?