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
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