能正常工作對我來說:
--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)
兩個腳本打印提交上我們的sql2005服務器? (我不得不評論'print @@ error_message()') – 2010-03-04 13:28:24
@@ error_message()應該是ERROR_MESSAGE()(當在一個CATCH塊中時) – 2010-03-04 13:30:18
@KM - 已經發現它,但它確實表明OP沒有運行這些腳本。他值得打屁股;) – 2010-03-04 13:33:26