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

Sql server 围绕多个插入或更新使用事务的正确方法,sql-server,transactions,Sql Server,Transactions,测试插入/更新失败并回滚此事务(如果有)的正确方法是什么?我认为我所做的不会起作用,因为我的插入/更新是3条独立的语句,@ROWCOUNT将只反映最后执行的语句 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)

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

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

如果您想自己执行回滚


插入失败将抛出。可以使用@@ROWCOUNT检测到“失败”更新。

我不知道您使用的是哪个版本,但自SQL 2005以来已经有了try/catch:

begin transaction
begin try
   INSERT INTO TableA (id) VALUES (1)
   INSERT INTO TableB (id) VALUES (1)
   UPDATE TableC SET id=1 WHERE id=2
end try
begin catch
   SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
   while(@@trancount > 0)
   begin
      rollback transaction
   end
end catch
if (@@trancount <> 0)
begin
   commit transaction;
end
开始交易
开始尝试
插入表A(id)值(1)
在表B(id)中插入值(1)
更新TableC集合id=1,其中id=2
结束尝试
开始捕捉
挑选
错误号()作为错误号,
ERROR_SEVERITY()作为ErrorSeverity,
ERROR_STATE()作为ErrorState,
ERROR_PROCEDURE()作为ErrorProcedure,
ERROR_LINE()作为ErrorLine,
错误消息()作为错误消息;
而(@@trancount>0)
开始
于事务回滚的语句是
结束
端接
如果(@@trancount 0)
开始
提交事务;
结束

事务回滚时,SET XACT_ABORT ON属性是否会引发错误消息?@Raza Yes。Xact_abort将中断执行流并自动回滚。错误仍将传递给客户端。
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
begin transaction
begin try
   INSERT INTO TableA (id) VALUES (1)
   INSERT INTO TableB (id) VALUES (1)
   UPDATE TableC SET id=1 WHERE id=2
end try
begin catch
   SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
   while(@@trancount > 0)
   begin
      rollback transaction
   end
end catch
if (@@trancount <> 0)
begin
   commit transaction;
end