t-sql 可能出现死锁的解决方法

Posted

技术标签:

【中文标题】t-sql 可能出现死锁的解决方法【英文标题】:t-sql possible deadlock solution 【发布时间】:2014-06-26 07:59:28 【问题描述】:

我正在运行耗时(几个小时)的过程,进行插入、选择更新。是否有可能对使用的数据进行尽可能低的锁定?我认为当我的其他程序尝试对该数据进行选择时,我在这里遇到了死锁问题。

我希望在我的过程中使用 select on big table date 的插入/删除/更新语句不会以任何方式阻止该数据(或者至少不用于选择)。

使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 会解决问题吗?我还阅读了有关快照的信息,但是数据库太大而无法将其设置为 ON。

【问题讨论】:

INSERTUPDATEDELETE始终独占锁定它们影响的行。如果您在单个事务中执行超过 5000 次操作,则锁定可能会升级到表级别,从而阻止这些表中的任何SELECT。尝试小批量更新您的UPDATE 等语句,如果可能的话,在您的数据库使用不多的时候...... 【参考方案1】:

是的,在每个查询批次的顶部使用set transaction isolation level read uncommitted 将有助于解决死锁问题。请记住,这些将是脏读,因为使用此设置时您不会读取任何“已提交”事务。我经常使用此语句来避免在具有高流量数据库表的生产环境中导致死锁问题。

在此处阅读使用 read uncommitted 的完整优缺点列表:http://sqlblog.com/blogs/tamarick_hill/archive/2013/05/06/pros-cons-of-using-read-uncommitted-and-nolock.aspx

【讨论】:

以上是关于t-sql 可能出现死锁的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

mysql死锁-产生原因和解决方法

Mysql并发时经典常见的死锁原因及解决方法

Java中线程死锁问题

java 死锁

试述死锁产生的原因和解决办法

postgresql查看死锁及解决方法