Sql-Server
我可以創建一個使用者定義的表類型並在同一個事務中使用它嗎?
當我執行以下操作時(在管理工作室中,GO 會將命令分成批次)
use tempdb begin tran go CREATE TYPE dbo.IntIntSet AS TABLE( Value0 Int NOT NULL, Value1 Int NOT NULL ) go declare @myPK dbo.IntIntSet; go rollback
我收到一條死鎖錯誤消息。我的過程與自身陷入僵局。我在 2008、2008R2 和 2012 年看到過這種行為。
有沒有辦法在它創建的同一個事務中使用我新創建的類型?
這已被報告了至少四次(但自從 Connect 被謀殺以來,所有痕跡都已從WayBack 機器中刪除)。這個是固定關閉的:
- connect.microsoft.com/SQLServer/feedback/details/365876/
但那不是真的。(另請查看解決方法部分 - 我建議的解決方法並不總是可以接受的。)
這個是按設計關閉的/不會修復:
- connect.microsoft.com/SQLServer/feedback/details/581193/
這兩個是較新的
並且仍然活躍:
- connect.microsoft.com/SQLServer/feedback/details/800919/ (現在關閉為Won’t Fix)
- connect.microsoft.com/SQLServer/feedback/details/804365/ (現在按設計關閉)
除非 Microsoft 可以說服其他人,否則您將不得不找到一種解決方法 - 只需在執行測試之前部署所有類型,或者將其分解為多個測試。
我將嘗試從我的聯繫人那裡確認 Umachandar 在最早的項目中所指的固定,因為顯然這與後來的陳述相衝突。
更新#1(希望正好是2)
原始錯誤(已修復為關閉)涉及別名類型,但不是類型
TABLE
. 它是針對 SQL Server 2005 報告的,它顯然沒有表類型和 TVP。似乎 UC 報告說,非表別名類型的錯誤已根據它們處理內部事務的方式進行了修復,但它沒有涵蓋後來引入表類型的類似場景。我仍在等待確認該原始錯誤是否應該被關閉為已修復;我建議按照設計將所有四個都關閉。這部分是因為它是我期望它工作的方式,部分是因為我從 UC 那裡得到感覺,“修復”它以不同的方式工作是非常複雜的,可能會破壞向後兼容性,並且會有助於案例數量非常有限。沒有什麼對您或您的案例不利,但在測試場景之外我'更新#2
我在部落格上寫過這個問題:
http://www.sqlperformance.com/2013/11/t-sql-queries/single-tx-deadlock