begin tran commit tran

BEGIN TRANSACTION ON 表示一个事物的开启
COMMIT TRANSACTION 表示一个事物的结束


问题

begin tran;

insert into TabA values(1);

insert into TabB values(1);

commit tran;

想的是两个插入操作要么同时成功, 要么 rollback.

但发现它的执行结构却是:

------------------------------------------------------------------------------------
服务器: 消息 2627,级别 14,状态 1,行 1
违反了 PRIMARY KEY 约束 'PK_tabA '。不能在对象 'TabA ' 中插入重复键。
语句已终止。

(所影响的行数为 1 行)
第一条语句因为主键约束, 插入失败.

而第二条语句成功了. faint.
如果这样的话, 那 begin tran/commit tran 语句还有什么用?

马可回复:
begin tran;

insert into TabA values(1);

if @@error <> 0 rollback
insert into TabB values(1);
if @@error <> 0 rollback


commit tran;

易水寒回复:

begin trans
insert into tableA values(1)
if @@error> 0 or @@rowcount <> 1
goto NeedRollBack

insert into tableB values(2)

NeedRollBack:
if @@error> 0 or @@rowcount <> 1
rollback tran
esle
commit tran

邹建回复:
--如果要用判断错误的方法处理,应该这样做:

--测试的表
create table tb(
id int not null constraint PK_sys_zj_fielddict primary key
,aa int)

--事务处理
begin tran
insert into tb values(1,1)
if @@error <> 0 goto lb_rollback
insert into tb values(1,1)
if @@error <> 0 goto lb_rollback
insert into tb values(2,1)
if @@error <> 0 goto lb_rollback
insert into tb values(2,1)
if @@error <> 0 goto lb_rollback
insert into tb values(3,1)
if @@error <> 0 goto lb_rollback
lb_commit:
commit tran
goto lb_ok
lb_rollback:
rollback tran

--显示结果
lb_ok:
select * from tb
drop table tb


邹建回复:
(马可) 和 (易水寒) 的方法是不能处理的,两位可以自行测试一下

而设置:
SET XACT_ABORT on
的方法可以做到回滚整个事务,达到楼主的要求,但要注意一点:

--创建测试表
create table tb(
id int not null constraint PK_sys_zj_fielddict primary key
,aa int)

--设置选项
SET XACT_ABORT on

--事务处理
begin tran
insert into tb values(1,1)
insert into tb values(1,1)
insert into tb values(2,1)
commit tran

--显示结果
/*--------注意
如果这样写的话,后面的语句不会被执行,如果要执行后面的语句,要在这句后面加上GO,仅查询分析分析器支持,所以如果是在存储过程中,要保证commit tran后面没有其他语句,否则出错时,其他语句不会被执行
-----------*/
select * from tb
drop table tb
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值