-1

我有以下查询:

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

通过回滚,我想撤消删除操作。没有得到任何结果,有什么问题?

4

3 回答 3

2

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

于 2013-09-03T09:21:35.217 回答
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 中。如果有任何错误,它将始终回滚。

于 2013-09-03T09:34:54.563 回答
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
于 2018-01-04T11:32:43.523 回答