SQL Server 死锁与事务隔离级别读取未提交

Posted

技术标签:

【中文标题】SQL Server 死锁与事务隔离级别读取未提交【英文标题】:SQL Server Deadlock with Transaction Isolation Level Read Uncommitted 【发布时间】:2015-04-15 20:31:11 【问题描述】:

即使我将事务级别设置为未提交,我也会遇到这种死锁。有什么我做错了吗?我想我应该在这里得到一个肮脏的阅读。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

   SELECT 
            DISTINCT 
            venueCourt.Id, 

错误

System.Data.SqlClient.SqlException: Transaction (Process ID 73) was deadlocked on thread | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

【问题讨论】:

你能分享更多的查询吗?我想知道是否还有其他影响它。此外,如果它在存储过程或触发器中运行,则隔离级别是临时的。 请实际执行计划。图像足以开始。 SP,以及查询中的大量连接 【参考方案1】:

如果查询对您进行并行处理,您可能会遇到死锁......虽然我会对这样一个简单的查询感到非常惊讶。

尝试在查询结束时添加 OPTION (MAXDOP 1)。

【讨论】:

好吧,查询没那么简单,相当复杂,我只是在它的顶部添加了它 你能解释一下 OPTION (MAXDOP 1) 会做什么吗? 它强制 SQL Server 只使用一个 CPU 核心(无并行性)。如果那是导致它的原因,应该清除你的僵局。 它会只为那个查询做吗?出于性能原因,如果可能的话,我想为其他查询保持并行性。

以上是关于SQL Server 死锁与事务隔离级别读取未提交的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER的锁机制——概述(锁与事务隔离级别)

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

事务隔离级别与阻塞

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

mysql,oracle,sql server中的默认事务隔离级别查看,更改

mysql,oracle,sql server中的默认事务隔离级别查看,更改