set xact_abort on
begin tran
update sc0 set lsj=10
insert into zsp(flno1) values('tttttt')--故意写错!不能执行!
commit tran
set xact_abort on
begin tran
update sc0 set lsj=10
exec ('insert into zsp(flno1) values('+''''+'tttttt'+''''+')')
commit tran
begin tran
update sc0 set lsj=10
insert into zsp(flno1) values('tttttt')--故意写错!不能执行!
commit tran
set xact_abort on
begin tran
update sc0 set lsj=10
exec ('insert into zsp(flno1) values('+''''+'tttttt'+''''+')')
commit tran
declare @err1 int,@err2 int
update sc0 set lsj=10
set @err1=@@error
insert into zsp(flno1) values('tttttt')--故意写错!不能执行!
set @err1=@@error
if @err1=0 and @err2=0
commit TRANSACTION
else
ROLLBACK TRANSACTION
在前面加了这个语句set xact_abort on 对于第一个批处理
begin tran
update sc0 set lsj=10
insert into zsp(flno1) values('tttttt')--故意写错!不能执行!
commit tran
可以回滚,但是对于第二个批处理
set xact_abort on
begin tran
update sc0 set lsj=10
exec ('insert into zsp(flno1) values('+''''+'tttttt'+''''+')')
commit tran
还是没有回滚呀是不是‘exec’ 的问题呀?
(
ID int check(ID=2)
)set xact_abort on
begin tran
exec('insert A select 1')
commit tran--查看
select * from A--删除测试环境
drop table A--结果
/*
ID
----------- (所影响的行数为 0 行)
*/
create table A
(
ID int,
mc varchar(1000) )create table b(id int)set xact_abort on
begin tran
insert into b select 1
exec('insert A(i) select 1')
commit tran
select * from b
应该表b中没有数据显示,但是他有!!
我不知道为什么?你可以试一下!!!多谢您的指点!!!
如果批处理中出现运行时语句错误(如违反约束),那么 SQL Server 中默认的行为将是只回滚产生该错误的语句。可以使用 SET XACT_ABORT 语句改变该行为。在 SET XACT_ABORT ON 语句执行之后,任何运行时语句错误都将导致当前事务自动回滚。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。
你出错的语句是属于语法错误自然不受SET XACT_ABORT 的影响,所以SQL不会自动回滚事务
要明白为什么叫Transact SQL 即每句都是事务