Sql-Server

我可以創建一個使用者定義的表類型並在同一個事務中使用它嗎?

  • November 25, 2020

當我執行以下操作時(在管理工作室中,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

引用自:https://dba.stackexchange.com/questions/52900