导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

关于事务的问题

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都要回滚,请问如何解决.
...全文
98 点赞 收藏 5
写回复
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
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告