sql-server - 围绕多个插入或更新使用事务的正确方法

标签 sql-server transactions

测试插入/更新失败并回滚此事务(如果有)的正确方法是什么?我认为我所拥有的不会起作用,因为我的插入/更新是 3 个单独的语句,并且 @@ROWCOUNT 将仅反射(reflect)最后执行的语句。

BEGIN TRANSACTION Script;
GO

INSERT INTO TableA (id) VALUES (1)
INSERT INTO TableB (id) VALUES (1)
UPDATE TableC SET id=1 WHERE id=2
GO

IF (@@ROWCOUNT=3 AND @@ERROR=0)
    BEGIN
    COMMIT
    END
ELSE
    BEGIN
    PRINT 'Error: Rolling back transaction'
    ROLLBACK TRANSACTION Script
    END
GO

最佳答案

如果在开始事务之前将 SET XACT_ABORT 设置为 ON,in case of an error, rollback will be issued automatically .

SET XACT_ABORT ON

begin transaction

INSERT INTO TableA (id) VALUES (1)
INSERT INTO TableB (id) VALUES (1)
UPDATE TableC SET id=1 WHERE id=2

commit transaction

如果你想自己回滚,use try .. catch block .

begin transaction

begin try

  INSERT INTO TableA (id) VALUES (1)
  INSERT INTO TableB (id) VALUES (1)
  UPDATE TableC SET id=1 WHERE id=2

  commit transaction

end try

begin catch
  raiserror('Message here', 16, 1)
  rollback transaction
end catch

关于sql-server - 围绕多个插入或更新使用事务的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10302697/

相关文章:

SQL 执行计划高成本 70%

sql-server - SQL Server 2008 Windows 身份验证登录错误 : The login is from an untrusted domain

sql - 成功插入后@@Error 可以为非零吗?

scala - 模拟specs2中的slick.dbio.DBIO组成

sql-server - ServiceStack OrmLite 和事务

google-app-engine - 应用引擎 : Mechanics of creating a unique entity if it doesn't exist

sql-server - SQL Server : The bulk load failed. 数据文件中第 1 行第 1 列的列太长

c# - SqlFileStream - 插入而不产生空文件

mysql - InnoDB 在外键上使用 where 子句时锁定不同的索引

java - 我是否需要在 Spring 事务中显式保存修改后的域对象?