我可以创建用户定义的表类型并在同一个事务中使用它吗?

Mic*_*art 14 sql-server-2008 sql-server deadlock sql-server-2012

当我执行以下命令时(在管理工作室中,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
Run Code Online (Sandbox Code Playgroud)

我收到一条死锁错误消息。我的过程已经陷入僵局。我在 2008、2008R2 和 2012 中看到过这种行为。

有没有办法在它创建的同一个事务中使用我新创建的类型?

Aar*_*and 17

这已被报告不少于四次(但自从 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