1.set XACT_ABORT ON
当SET XACT_ABORT为ON时,如果Transact-SQL语句产生运行时错误,整个事务将终止并回滚,为OFF时,只回滚产生错误的Transact-SQL语句,而事务将继续进行处理.
2.判断事务
在sql中用事务的时候一般是这么写
begin tran
sql语句
if @@error>0
rollback tran
else
commit tran
3.异同
判断事务回滚,则整个事务里面的sql语句一起回滚,跟SET XACT_ABORT ON相似,不同的是当事务进行嵌套时,如果用事务判断的方法,嵌套的子事务不出错,外面语句出错,那么整个事务只会回滚外面出错的语句,子事务提交成功了就回滚不了了,但是用SET XACT_ABORT ON,即使子事务提交成功,如果外围事务出错,子事务还是回滚.
4.举例
create table tran1(id int,name varchar(10))
create table tran2(id int,name varchar(10))
--存储过程1
create proc TesTran as
begin
begin tran
insert into tran1 values (1,'1的极')
insert into tran2 values (2,'2的的是')
if @@error>0
rollback tran
else
commit tran
end
--存储过程2
create proc TesTranAll as
begin
begin tran
insert into tran1 values (1,'1的十分十分师范生')--值太长错误
exec TesTran
if @@error>0
rollback tran
else
commit tran
end
delete from tran1
delete from tran2
--执行存储过程
--exec TesTran
exec TesTranAll
我这样写的话,执行完后查询表2个表里面都有数据了,如果我把存储过程2改成:
create table tran2(id int,name varchar(10))
--存储过程1
create proc TesTran as
begin
begin tran
insert into tran1 values (1,'1的极')
insert into tran2 values (2,'2的的是')
if @@error>0
rollback tran
else
commit tran
end
--存储过程2
create proc TesTranAll as
begin
begin tran
insert into tran1 values (1,'1的十分十分师范生')--值太长错误
exec TesTran
if @@error>0
rollback tran
else
commit tran
end
delete from tran1
delete from tran2
--执行存储过程
--exec TesTran
exec TesTranAll
我这样写的话,执行完后查询表2个表里面都有数据了,如果我把存储过程2改成:
alter proc TesTranAll as
begin
set XACT_ABORT on
begin tran
insert into tran1 values (1,'1的十分十分师范生')
exec TesTran
commit tran
end
这样的话,执行存储过程2,查询2个表就都没有数据!
--执行存储过程后,查询表
select * from tran1
select * from tran2
--执行存储过程后,查询表
select * from tran1
select * from tran2