我需要将其中一张表的几行更新为原子操作。
更新涉及增加某些行的 int 列中的一些值。我需要将几行中的值作为单个操作递增。
最好的方法是什么?
为我回答这个问题归结为回答以下两个:
- 如果我使用LINQ to SQL,如何实现增量操作的原子性(我是使用事务,还是有更好的方法)?
- 存储过程是否以原子方式执行(如果我在数据库上调用该过程)?
我正在使用 SQL Server 使用 C#。
我需要将其中一张表的几行更新为原子操作。
更新涉及增加某些行的 int 列中的一些值。我需要将几行中的值作为单个操作递增。
最好的方法是什么?
为我回答这个问题归结为回答以下两个:
我正在使用 SQL Server 使用 C#。
在 SQL Server 中,不同操作之间的原子性是通过使用来实现的Explicit Transactions
,其中用户使用关键字显式启动事务BEGIN TRANSACTION
,一旦所有操作完成且没有任何错误,您就可以使用关键字提交事务COMMIT TRANSACTION
,以防出错/例外您可以通过使用关键字ROLLBACK TRANSACTION
Write Ahead Strategy
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
我找到了答案:不能直接通过 LINQ to SQL 实现增量。但是,可以从 LINQ 调用存储过程,并且可以在那里实现增量。
我的解决方案是创建一个存储过程,该过程将在事务中的单个 while 循环内执行必要的更新。这样,所有更新都作为单个原子操作执行。
UPDATE 语句本身是原子的。