关于事务的问题

laughsmile 2006-01-22 12:11:03
现在有2部分sql.第一部分sql是一系列update,第2部分sql是insert ...select...
第2部分的sql的select结果依赖于第一部分sql,也就是第一部分sql提交之后,然后执行第2部分sql才有意义.
但是问题是:现在要求第2部分sql如果出错,所有sql都要回滚,请问如何解决.
...全文
135 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
laughsmile 2006-01-22
  • 打赏
  • 举报
回复
我试试看,谢谢啦:)
OracleRoob 2006-01-22
  • 打赏
  • 举报
回复
--那就用嵌套事务




create table t1 (a int primary key)
go

set xact_abort on
go

begin tran
begin tran
insert into t1 values (1)
commit tran --提交第一部分SQL语句

select * from t1
--表中有数据

insert into t1 values (1) --主键冲突,整个事务中所有语句操作回滚,包括第一部分SQL语句的更新操作
commit tran
go

select * from t1

--结果表中没有记录

drop table t1
go


laughsmile 2006-01-22
  • 打赏
  • 举报
回复
TO wangtiecheng(cappuccino):
不好意思,可能我没有说清楚,你可能没有明白我的意思.
第一部分sql提交之后,然后执行第2部分sql才有意义.
如果第一部分sql与第2部分sql一起提交是没有意义的.但是我又想达到回滚的效果.
OracleRoob 2006-01-22
  • 打赏
  • 举报
回复

--在第一个例子中产生错误,但其它语句均成功执行且事务成功提交。
create table t1 (a int primary key)
go

set xact_abort off
go

begin tran
insert into t1 values (1)
insert into t1 values (1) --主键冲突,当前语句追加失败
commit tran
go

select * from t1

--结果表中有一行记录

drop table t1
go




--在第二个例子中,set xact_abort 设置为 on。这导致语句错误使批处理终止,并使事务回滚。
create table t1 (a int primary key)
go

set xact_abort on
go

begin tran
insert into t1 values (1)
insert into t1 values (1) --主键冲突,整个事务中所有语句操作回滚
commit tran
go

select * from t1

--结果表中没有记录

drop table t1
go

OracleRoob 2006-01-22
  • 打赏
  • 举报
回复
--当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。
set xact_abort on

--开始事务
begin tran

--第一部分SQL

--第二部分SQL

--提交事务
commit tran
return 0

34,838

社区成员

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

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