我需要以原子操作的形式更新其中一张表的几行。
更新涉及增加某些行的 int 列中的某些值。我需要将多行中的值作为单个操作递增。
执行此操作的最佳方法是什么?
对我来说,回答这个问题归结为回答以下两个问题:
- 如果我使用 LINQ to SQL,我如何实现增量的原子性 操作(我是使用事务,还是有更好的方法)?
- 存储过程是否以原子方式执行(如果我在数据库上调用该过程)?
我正在使用 C# 和 SQL Server 工作。
最佳答案
在 SQL Server 中,不同操作之间的原子性是通过使用 Explicit Transactions
实现的,其中用户通过使用关键字 BEGIN TRANSACTION
显式启动事务,并且一旦所有操作完成时没有任何错误您可以使用关键字 COMMIT TRANSACTION
提交事务,如果出现错误/异常,您可以使用关键字 ROLLBACK TRANSACTION 在正在进行的事务中的任何位置撤消工作
预写策略
SQL Server 使用Write Ahead Strategy
来确保事务的原子性和数据的持久性,当我们对数据进行任何更改/更新时,SQL Server 会执行以下步骤
- 将数据页加载到缓冲区缓存中。
- 更新缓冲区中的副本。
- 在日志缓存中创建日志记录。
- 通过检查点进程将日志记录保存到磁盘。
- 将数据保存到磁盘。
因此,如果您决定回滚事务,则在所有这些步骤的过程中的任何位置。您在磁盘上的实际数据保持不变。
我的建议
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/