CREATE PROCEDURE aaaa(@aaa varchar(200),@bbb as int) AS begin SET XACT_ABORT ON GO begin transaction insert into aaa(aaa) values(@aaa) insert into bbb(bbb) values(@bbb) commit transaction end GO --执行SET XACT_ABORT ON之后,事务才会执行回滚
CREATE PROCEDURE aaaa(@aaa varchar(200),@bbb as int) AS begin transaction insert into aaa(aaa) values(@aaa) if @@error<>0 goto lb_err insert into bbb(bbb) values(@bbb) if @@error<>0 goto lb_err commit transaction returnlb_err: rollback tran GO
用 SET XACT_ABORT ON ,是有错误时自己停止并回滚事务,而不是:事务才会执行回滚
to lyl77 (lyl77): 每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。 对于你的代码 CREATE PROCEDURE aaaa(@aaa varchar(200),@bbb as int) AS begin transaction insert into aaa(aaa) values(@aaa) insert into bbb(bbb) values(@bbb) if @@error=0 commit tran else rollback tran GO --如果insert into aaa(aaa) values(@aaa)出错(这个时候@@error<>0),insert into bbb (bbb) values(@bbb)正确(这个时候@@error=0) =>依然不能执行rollback tran
AS
begin
SET XACT_ABORT ON
GO
begin transaction
insert into aaa(aaa) values(@aaa)
insert into bbb(bbb) values(@bbb)
commit transaction
end
GO
--执行SET XACT_ABORT ON之后,事务才会执行回滚
AS
begin transaction
insert into aaa(aaa) values(@aaa)
if @@error<>0 goto lb_err
insert into bbb(bbb) values(@bbb)
if @@error<>0 goto lb_err
commit transaction
returnlb_err:
rollback tran
GO
每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
对于你的代码
CREATE PROCEDURE aaaa(@aaa varchar(200),@bbb as int)
AS
begin transaction
insert into aaa(aaa) values(@aaa)
insert into bbb(bbb) values(@bbb)
if @@error=0 commit tran
else
rollback tran
GO
--如果insert into aaa(aaa) values(@aaa)出错(这个时候@@error<>0),insert into bbb
(bbb) values(@bbb)正确(这个时候@@error=0)
=>依然不能执行rollback tran
谢谢,是的,应该更严谨一点的
SQL里面有没有这样的设置,当事务中有一个错误时,事务中已完成的操作都要回