一个PRINT'成功'搞砸了开始trans / begin尝试提交/结束尝试?

时间:2010-03-04 13:15:28

标签: sql-server-2005 tsql

所以我看到了一个奇怪的行为

在一个脚本中有类似的东西:

  begin transaction
  begin try

       stuff
       stuff
       stuff

       print 'commit'
       commit transaction
  end try
  begin catch
       print 'rollback'
       print error_message()
       rollback transaction
  end catch

事情就是当这个脚本在运行时,我看到了打印提交消息,但它没有进行提交并锁定表/行/等

我必须通过选择该行并运行它来手动运行提交。

但如果我这样做

 begin transaction
  begin try

       stuff
       stuff
       stuff

       commit transaction
       print 'commit'
  end try
  begin catch
       print error_message()
       rollback transaction
       print 'rollback'
  end catch

(交换打印和提交)

效果很好。

谁知道为什么会这样呢?

1 个答案:

答案 0 :(得分:2)

这对我来说很好:

--create table t (rowid int)  --create one time before running script

begin transaction
  begin try

       insert into t values (1)
       print 'commit'
       print XACT_STATE()   --should be 1
       commit transaction
       print XACT_STATE()   --should be 0
  end try
  begin catch
       print ERROR_MESSAGE()
       rollback transaction
       print 'rollback'
  end catch

select * from t

输出

commit
1
0
rowid
-----------
1

关闭你的SSMS窗口,打开一个新窗口,然后再次运行你的第一个脚本,我敢打赌你第一次运行它时有一个打开的事务,所以你需要额外的COMMIT。

OP评论后

编辑

在与每个数据库的新连接中运行此确切脚本:

BEGIN TRY create table t (rowid int) END TRY BEGIN CATCH END CATCH

print 'A - XACT_STATE()='+ISNULL(CONVERT(varchar(10),XACT_STATE()),'')+', @@TRANCOUNT='+ISNULL(CONVERT(varchar(10),@@TRANCOUNT),'')

begin transaction
  begin try

       insert into t values (1)
       print 'commit'
       print 'B - XACT_STATE()='+ISNULL(CONVERT(varchar(10),XACT_STATE()),'')+', @@TRANCOUNT='+ISNULL(CONVERT(varchar(10),@@TRANCOUNT),'')
       commit transaction
       print 'C - XACT_STATE()='+ISNULL(CONVERT(varchar(10),XACT_STATE()),'')+', @@TRANCOUNT='+ISNULL(CONVERT(varchar(10),@@TRANCOUNT),'')
  end try
  begin catch
       print ERROR_MESSAGE()
       rollback transaction
       print 'rollback'
  end catch

print 'D - XACT_STATE()='+ISNULL(CONVERT(varchar(10),XACT_STATE()),'')+', @@TRANCOUNT='+ISNULL(CONVERT(varchar(10),@@TRANCOUNT),'')

select * from t

你应该得到这个:

A - XACT_STATE()=0, @@TRANCOUNT=0

(1 row(s) affected)
commit
B - XACT_STATE()=1, @@TRANCOUNT=1
C - XACT_STATE()=0, @@TRANCOUNT=0
D - XACT_STATE()=0, @@TRANCOUNT=0
rowid
-----------
1

(1 row(s) affected)