事务回放问题

mmfeng 2011-11-13 05:29:26
在这个储存过程中的事务中包括二条插入语句和一个更新语句,
begin transaction tr_cg
INSERT INTO 物料采购表(编号,采购方式,操作员,说明)
values(@NEW_ID,@采购方式,@操作员,@说明)
INSERT INTO 物料采购表明细(物料采购表编号,申购表编号)
values(@NEW_ID,@申购表编号)
update 申购表 set flag_cg=1 where 编号=@申购表编号
commit transaction tr_cg

假如当第一条insert成功后,第二条不成功的话,不会对第一个insert 的数据进行回滚,数据库还是出现第一条的插入数据,请问怎样才能当三条语句任一条出错时整个回放?
...全文
96 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2011-11-13
  • 打赏
  • 举报
回复
用set XACT_ABORT on ;
begin tran
....sql语句
commitr tran

当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
pengxuan 2011-11-13
  • 打赏
  • 举报
回复
SET XACT_ABORT

指定当 Transact-SQL 语句出现运行时错误时,SQL Server 是否自动回滚到当前事务。

当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。

当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。

XACT_ABORT 默认就是ON的
楼主自己写的
begin transaction tr_cg
INSERT INTO 物料采购表(编号,采购方式,操作员,说明)
values(@NEW_ID,@采购方式,@操作员,@说明)
INSERT INTO 物料采购表明细(物料采购表编号,申购表编号)
values(@NEW_ID,@申购表编号)
update 申购表 set flag_cg=1 where 编号=@申购表编号
commit transaction tr_cg
应该是可以回滚的,但是你的情况不能回滚,可能是SQL Server的XACT_ABORT属性被设置了OFF
mmfeng 2011-11-13
  • 打赏
  • 举报
回复
谢谢啊,是整个回放,我原来也是这样的,但就是不行,原来要加上 set xact_abort on ,这个是指可以进行事务回放么?
我在网上找了一下,用的这个也可以,不过没有你的简洁明了:

begin tran
INSERT INTO 物料采购表(编号,采购方式,操作员,说明)
values(@NEW_ID,@采购方式,@操作员,@说明)
if @@error<>0
goto error
INSERT INTO 物料采购表明细(物料采购表编号,申购表编号)
values(@NEW_ID,@申购表编号)
if @@error<>0
goto error
update 申购表 set flag_cg=1 where 编号=@申购表编号
if @@error<>0
goto error
commit tran
return 0
error:
rollback tran
return 1
--小F-- 2011-11-13
  • 打赏
  • 举报
回复
---如果是分别回滚 这样

begin transaction tr_cg
begin
INSERT INTO 物料采购表(编号,采购方式,操作员,说明)
values(@NEW_ID,@采购方式,@操作员,@说明)
end
begin
INSERT INTO 物料采购表明细(物料采购表编号,申购表编号)
values(@NEW_ID,@申购表编号)
end
begin
update 申购表 set flag_cg=1 where 编号=@申购表编号
end
commit transaction tr_cg
--小F-- 2011-11-13
  • 打赏
  • 举报
回复
--SORRY 修改下
set xact_abort on
begin transaction tr_cg
INSERT INTO 物料采购表(编号,采购方式,操作员,说明)
values(@NEW_ID,@采购方式,@操作员,@说明)
INSERT INTO 物料采购表明细(物料采购表编号,申购表编号)
values(@NEW_ID,@申购表编号)
update 申购表 set flag_cg=1 where 编号=@申购表编号
commit transaction tr_cg
--小F-- 2011-11-13
  • 打赏
  • 举报
回复
请问怎样才能当三条语句任一条出错时整个回放?

到底是整个回放 还是怎么样?

如果整个回放 可以这样

SET XABORT ON 
begin transaction tr_cg
INSERT INTO 物料采购表(编号,采购方式,操作员,说明)
values(@NEW_ID,@采购方式,@操作员,@说明)
INSERT INTO 物料采购表明细(物料采购表编号,申购表编号)
values(@NEW_ID,@申购表编号)
update 申购表 set flag_cg=1 where 编号=@申购表编号
commit transaction tr_cg
  • 打赏
  • 举报
回复
事务的基本特征就是里面的操作要么全部完成,要不一个都不做。当有一个操作发生错误,事务里面的所有操作就会回滚。

如果要解决你的问题,那么就不要放在一个事务当中
mmfeng 2011-11-13
  • 打赏
  • 举报
回复
还是没解决,,,,,呜。
fredrickhu,按你说的不行啊,现在数据什么也没有插入。
mmfeng 2011-11-13
  • 打赏
  • 举报
回复
查了GOOGLE 解决了,加上 if @@Error<>0 就行了。

--小F-- 2011-11-13
  • 打赏
  • 举报
回复
begin transaction tr_cg  
INSERT INTO 物料采购表(编号,采购方式,操作员,说明)
values(@NEW_ID,@采购方式,@操作员,@说明)
ROLLBACK
INSERT INTO 物料采购表明细(物料采购表编号,申购表编号)
values(@NEW_ID,@申购表编号)
ROLLBACK
update 申购表 set flag_cg=1 where 编号=@申购表编号
ROLLBACK
commit transaction tr_cg

34,576

社区成员

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

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