2010-03-04 39 views
1

所以我剛纔看到一個怪異的行爲a PRINT'成功',搞砸了開始反式/開始嘗試提交/結束嘗試?

在一個腳本有一樣的東西:

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 

(換打印和提交)

它做工精細。

有人知道爲什麼會發生這種情況嗎?

+0

兩個腳本打印提交上我們的sql2005服務器? (我不得不評論'print @@ error_message()') – 2010-03-04 13:28:24

+0

@@ error_message()應該是ERROR_MESSAGE()(當在一個CATCH塊中時) – 2010-03-04 13:30:18

+0

@KM - 已經發現它,但它確實表明OP沒有運行這些腳本。他值得打屁股;) – 2010-03-04 13:33:26

回答

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的窗口,打開一個新的窗口,然後再次運行腳本月1日,我敢打賭,你有一個第一次運行它時打開事務,所以你需要額外的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) 
+0

+1。大多數人都喜歡OP的問題的原因。 – 2010-03-04 13:40:09

+0

我剛剛問過,第一個腳本在開發服務器上運行良好,但不在prod服務器上,prod服務器必須使用第二個腳本 – Fredou 2010-03-04 13:40:13

+0

將在大約4小時內完成,謝謝 – Fredou 2010-03-04 14:14:56