begin tran/commit tran 的问题.

nickr 2003-10-30 03:44:19
我在使用 SqlServer 的时候遇到这样一个问题.

我打算用下面的语句:

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 语句还有什么用?

大侠们给指点指点吧. 谢谢啦.
...全文
1700 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CoolKin9 2003-11-12
  • 打赏
  • 举报
回复
gz
zjcxc 2003-10-31
  • 打赏
  • 举报
回复
txlicenhe(马可) 和 longleaver(易水寒) 的方法是不能处理的,两位可以自行测试一下

而设置:
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

zjcxc 2003-10-31
  • 打赏
  • 举报
回复
--如果要用判断错误的方法处理,应该这样做:

--测试的表
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
zjcxc 2003-10-31
  • 打赏
  • 举报
回复
要判断错误,如果出错,就回滚.
iloveyoustt 2003-10-31
  • 打赏
  • 举报
回复
你没有用到rollback tran
longleaver 2003-10-31
  • 打赏
  • 举报
回复
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
LoveSQL 2003-10-30
  • 打赏
  • 举报
回复
前面加上这句话就好了
SET XACT_ABORT on ----设置
或是
在程序里判断有错误时执行rollback tran 这个语句也可以。
pengdali 2003-10-30
  • 打赏
  • 举报
回复
SET XACT_ABORT on ----设置
go

create table #Table1 (a tinyint)
go
begin tran
insert #table1 values(1) ----成功
insert #table1 values(1000) ----这句将报错
commit tran
go
select * from #table1
go
drop table #table1
txlicenhe 2003-10-30
  • 打赏
  • 举报
回复
begin tran;

insert into TabA values(1);

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


commit tran;

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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