2011-05-04 60 views
2

我正在使用python MSSQL驅動程序pymssql。我遇到了一個有趣的情況,我似乎無法找到相關文檔。看來,當一個CREATE TABLE語句失敗,它在運行的事務被隱式回滾:爲什麼Microsoft SQL Server在CREATE語句失敗時隱式回滾?

-- shows 0 
select @@TRANCOUNT 
BEGIN TRAN 

-- will cause an error 
INSERT INTO foobar values ('baz') 

-- shows 1 as expected 
select @@TRANCOUNT 

-- will cause an error 
CREATE TABLE badschema.t1 (
    test1 CHAR(5) NOT NULL 
) 

-- shows 0, this is not expected 
select @@TRANCOUNT 

我想明白爲什麼發生這種情況,瞭解是否有描述的情況文檔。我將在驅動程序中圍繞此行爲進行編碼,但我想確保對隱式回滾事務的其他任何錯誤類型都這樣做。

注意

我不是典型的事務行爲關注這裏。我特別想知道爲什麼隱含的回滾是在失敗的CREATE語句的情況下給出的,但不是INSERT語句的情況。

回答

1

這裏是明確指導錯誤在SQL服務器處理:
http://www.sommarskog.se/error-handling-I.html

它的長,但在一個好辦法,它是爲SQL Server 2000編寫的,但大部分仍然是準確的。你要找的那部分是在這裏:
http://www.sommarskog.se/error-handling-I.html#whathappens

在你的情況,文章說,SQL Server正在執行批流產,而且將採取以下情形措施:

  • 大多數轉換錯誤,例如將非數字字符串轉換爲數字值。
  • 對無參數存儲過程的多餘參數。
  • 超出存儲過程,觸發器和函數的最大嵌套級別。
  • 被選爲死鎖受害者。
  • INSERT-EXEC中列數不匹配。
  • 數據文件或事務日誌空間不足。

還有一點比它更多,所以請務必閱讀整個部分。

+0

_在這種情況下,爲什麼會產生一次墮胎,只有在微軟的人才能回答; – 2011-05-04 01:30:34

+0

謝謝,那裏有很多信息,批處理中止的概念似乎與我所看到的一致。有趣的是,雖然我的CREATE語句失敗似乎不適合任何這些條件。 – 2011-05-04 01:57:30

1

它往往是,但並非總是如此,如果它的任何部分出現故障交易的點回滾整個事情http://www.firstsql.com/tutor5.htm

一個使用交易最常見的原因是,當您需要動作是原子的:

計算機原子操作 科學是指一組操作 的,可以結合起來,使他們 出現在系統的其餘部分是 單一操作只有兩個 可能的結果:成功或失敗。 en.wikipedia.org/wiki/Atomic_(computer_science)

它可能沒有記錄,因爲,如果我正確地理解你的例子,假設你打算通過功能開始交易與BEGIN TRAN

+0

沒有假設使用事務自動意味着你想要回滾整個事物。此外,你甚至運行SQL?你有沒有注意到這兩個錯誤如何處理的區別? INSERT錯誤不會回滾,但CREATE錯誤會發生。這是我試圖找出的不一致之處。如果他們都回滾了,那不會是什麼大不了的事情。 – 2011-05-04 00:34:35

+0

?? 「Transcations」部分的第一段:http://www.codeproject.com/KB/database/sqlservertransactions.aspx – jefflunt 2011-05-04 00:40:45

+0

這只是一個典型的用法。還有其他用例。例如,在Web應用程序中啓動事務,創建INSERT,創建第二個INSERT,以及如果第二個INSERT失敗,調整某些內容並嘗試另一個INSERT,將是完全可以接受的。在這種情況下,使用事務,但不會因爲遇到錯誤而自動發出ROLLBACK。此外,我的問題並不針對典型的交易行爲。具體問題是爲什麼一個案例會導致隱式ROLLBACK,另一個案例不會。 – 2011-05-04 00:54:16

1

如果您作爲一個批處理運行(我第一次運行),事務將保持打開狀態,因爲INSERT會中止批處理,並且CREATE TABLE不會運行。只有當你運行線由行做交易得到回滾

您還可以通過設置SET XACT_ABORT ON.

我的猜測生成的INSERT隱式回退(只是有一個燈泡時刻,我輸入的句子以上)是CREATE TABLE使用SET XACT_ABORT ON internalls =隱含回滾在實踐

從我一些更多的東西,所以關於SET XACT_ABORT(我們用它在我們所有的代碼,因爲它釋放鎖並回滾TXNs在客戶端的CommandTimeout)

相關問題