在SQL中回滚

时间:2013-09-03 09:18:53

标签: sql sql-server sql-server-2008

我有以下查询:

use valid
begin transaction t1
go
delete from dbo.do
rollback transaction t1
go

使用回滚我想撤消删除操作。不要得到任何结果,有什么不对?

3 个答案:

答案 0 :(得分:2)

在开始交易后尝试不使用“go”。

答案 1 :(得分:0)

您的查询在第一眼看上去似乎没问题,它应该没有任何问题。我尝试了类似的示例代码,如下所示,它工作正常:

  use [replocal]
  begin transaction t1
  go 
  delete from dbo.ftpfilelog
  rollback transaction t1
  go
  select * from dbo.ftpfilelog

但是如果你在DELETE语句之后有任何其他查询并且它抛出错误并且在这种情况下从未达到ROLLBACK语句,那么你的行就会消失。

你最好使用TRY..CATCH并将你的ROLLBACK放在CATCH中。如果有任何错误,它将始终回滚。

答案 2 :(得分:0)

您可以使用安全简便的代码运行100%(运行所有查询行)或不运行任何关闭

  • |查询1 | =喜欢插入或选择或...
  • |行数| =号码关闭查询
    DECLARE @rowcount int  set @rowcount = 0 ; 
    BEGIN TRANSACTION [Tran1]
    BEGIN TRY 
     <Query 1> ; set @rowcount = (@rowcount + @@ROWCOUNT); 
     <Query 2> ; set @rowcount = (@rowcount + @@ROWCOUNT); 
    ...
    IF @rowcount =  <count of lines>
      COMMIT TRANSACTION[Tran1]
    ELSE
      ROLLBACK TRANSACTION[Tran1]
    END TRY
      BEGIN CATCH
      ROLLBACK TRANSACTION[Tran1]
    END CATCH

例如这个代码运行2插入行查询但是或者运行他或者没有运行任何东西和ROLLBACK

    DECLARE @rowcount int  set @rowcount = 0 ; 
    BEGIN TRANSACTION [Tran1]
    BEGIN TRY 
     insert into [database].[dbo].[tbl1] (fld1) values('1') ;
        set @rowcount = (@rowcount + @@ROWCOUNT); 
     insert into [database].[dbo].[tbl2] (fld1) values('2') ;
        set @rowcount = (@rowcount + @@ROWCOUNT); 

    IF @rowcount =  2
      COMMIT TRANSACTION[Tran1]
    ELSE
      ROLLBACK TRANSACTION[Tran1]
    END TRY
      BEGIN CATCH
      ROLLBACK TRANSACTION[Tran1]
    END CATCH