症状
请考虑以下情况:
-
您有一个 Microsoft SQL Server 2012 数据库,其中已启用 " ALLOW_SNAPSHOT_ISOLATION " 和 " READ_COMMITTED_SNAPSHOT " 选项。
-
对同一个表运行至少三个并发查询。
-
查询使用(TABLOCK、UPDLOCK) 查询提示。
-
每个查询都包装在一个显式的 BEGIN 事务 语句中,但不执行 提交事务 语句 。
在此方案中提交第一个查询时,其他查询之一将死锁。当 READ_COMMITTED_SNAPSHOT 与 TABLOCK 和 UPDLOCK 查询提示一起使用时,会话将在表上采用 IX 锁。 当两个并发会话尝试同时将 IX 锁转换为 X 个锁时,将发生死锁。 如果禁用 READ_COMMITTED_SNAPSHOT ,则会话将获取六个锁,这些锁在转换为 X 锁时不会死锁。 此修补程序通过 READ_COMMITTED_SNAPSHOT 在与 TABLOCK 和 UPDLOCK 提示一起使用时,通过授予 LCK_M_SCH_S 锁而不是 IX 锁来解决此问题。注意此问题也会在 Microsoft SQL Server 2008 R2 中发生。 将很快发布 SQL Server 2008 R2 的修补程序。
解决方案
在 SQL Server 的以下累积更新中,此问题首先已修复。
SQL Server 2012 SP1 的累积更新8 /en-us/help/2917531
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。