我从网上查了下,这句话的作用是:
“当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。”
在sql中用事务的时候一般是这么写
begin tran
sql语句
if @@error>0
rollback tran
else
commit tran
我想问一下,“SET XACT_ABORT ON”这句话是不是和我们判断事务出错“if @@error>0 rollback tran”是一个作用的啊?我在看这个解释的时候,他举得个例子,例子里面的事务是没有判断sql出错回滚的,是不是如果直接写
begin tran
sql语句
commit tran
的时候加这个“SET XACT_ABORT ON”,如果写了判断的话就不用写这句话了啊?还有就是在一个事务里面如果判断事务回滚,整个事务里面的sql语句是不是都一块回滚了?请高手帮忙解答下,谢谢啦!
“当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。”
在sql中用事务的时候一般是这么写
begin tran
sql语句
if @@error>0
rollback tran
else
commit tran
我想问一下,“SET XACT_ABORT ON”这句话是不是和我们判断事务出错“if @@error>0 rollback tran”是一个作用的啊?我在看这个解释的时候,他举得个例子,例子里面的事务是没有判断sql出错回滚的,是不是如果直接写
begin tran
sql语句
commit tran
的时候加这个“SET XACT_ABORT ON”,如果写了判断的话就不用写这句话了啊?还有就是在一个事务里面如果判断事务回滚,整个事务里面的sql语句是不是都一块回滚了?请高手帮忙解答下,谢谢啦!
sql语句1
if @@error>0
rollback tran
sql语句2
if @@error>0
rollback tran
commit tran还有就是在一个事务里面如果判断事务回滚,整个事务里面的sql语句是不是都一块回滚了?
--是都回滚!!
如果不是。那肯定就不一样。你COPY和帮助文档说的很清楚了
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--执行存储过程
exec TesTranAll--执行存储过程后,查询表
select * from tran1
select * from tran2
alter 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
alter proc TesTranAll as
begin
begin tran
insert into tran1 values (1,'1的十分十分师范生')
exec TesTran--执行存储过程1
if @@error>0
rollback tran
else
commit tran
end--执行存储过程
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个表就都没有数据!
“SET XACT_ABORT ON”是这么牛的啊?
if @@error>0
rollback tran
else
commit tran
end
这句话相比,有性能或者什么方面的差别吗?如果判断会更省资源等的,那在一般情况下我就用判断的。如果没什么区别那我以后就用这句话了。
这方面的东西都不了解,麻烦大侠指导下,谢谢!