sqlserver中的“SET XACT_ABORT ON”

sy_flydream 2012-07-13 01:27:14
我从网上查了下,这句话的作用是:
“当 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语句是不是都一块回滚了?

请高手帮忙解答下,谢谢啦!
...全文
858 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sy_flydream 2012-07-13
  • 打赏
  • 举报
回复
我现在感觉是以后写事务就直接用“SET XACT_ABORT ON”了,安全保险,不管嵌套几层事务都会完全回滚,如果要按需求做,那请问这句话和
if @@error>0
rollback tran
else
commit tran
end
这句话相比,有性能或者什么方面的差别吗?如果判断会更省资源等的,那在一般情况下我就用判断的。如果没什么区别那我以后就用这句话了。
这方面的东西都不了解,麻烦大侠指导下,谢谢!
SQL77 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
--存储过程1
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 T……
[/Quote]
所以说要看你啥需求啊
sy_flydream 2012-07-13
  • 打赏
  • 举报
回复
--存储过程1
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”是这么牛的啊?
sy_flydream 2012-07-13
  • 打赏
  • 举报
回复
我发现还是加上这句话好,但是还是有疑问,我做了下面的例子,事务之间进行嵌套,如果用判断事务的办法,嵌套的子事务如果不出错,外面的语句出错,那么整个事务只会回滚外面出错的语句,子事务提交成功了就回滚不了了。但我如果用“SET XACT_ABORT ON”,即使子事务提交成了,整个外围事务出错,子事务也会回滚--创建2个表
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
SQL77 2012-07-13
  • 打赏
  • 举报
回复
,“SET XACT_ABORT ON”这句话是不是和我们判断事务出错“if @@error>0 rollback tran”是一个作用的啊

如果if @@error>0 rollback tran回滚的是整个事务那就一样。
如果不是。那肯定就不一样。你COPY和帮助文档说的很清楚了
jwdream2008 2012-07-13
  • 打赏
  • 举报
回复
如果不加:SET XACT_ABORT ON,那么存储过程中的每个句子都要进行事务出错判断。如:begin tran  
sql语句1
if @@error>0
rollback tran
sql语句2
if @@error>0
rollback tran
commit tran

还有就是在一个事务里面如果判断事务回滚,整个事务里面的sql语句是不是都一块回滚了?
--是都回滚!!

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧