我有以下查询:
use valid
begin transaction t1
go
delete from dbo.do
rollback transaction t1
go
通过回滚,我想撤消删除操作。没有得到任何结果,有什么问题?
我有以下查询:
use valid
begin transaction t1
go
delete from dbo.do
rollback transaction t1
go
通过回滚,我想撤消删除操作。没有得到任何结果,有什么问题?
开始交易后尝试不使用“go”。
乍一看,您的查询似乎没问题,它应该可以正常工作。我尝试了类似的示例代码,如下所示,它工作正常:
use [replocal]
begin transaction t1
go
delete from dbo.ftpfilelog
rollback transaction t1
go
select * from dbo.ftpfilelog
但是,如果您在 DELETE 语句之后有任何其他查询并且它抛出错误并且在这种情况下从未达到 ROLLBACK 语句,那么您的行就消失了。
你最好使用 TRY..CATCH 并将你的 ROLLBACK 放在 CATCH 中。如果有任何错误,它将始终回滚。
您可以使用安全简单的代码来运行 100%(运行所有查询行)或不运行任何代码
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