导致死锁错误的 SQL 查询

Posted

技术标签:

【中文标题】导致死锁错误的 SQL 查询【英文标题】:SQL queries causing deadlock errors 【发布时间】:2015-04-01 04:56:10 【问题描述】:

有一个更新查询导致死锁错误,我不知道为什么。更新查询中已经使用了 (rowlock, updlock) 提示,但仍会出现死锁错误。

示例查询:

update table a with (rowlock, updlock) 
set a.column1 = value

同样的查询用在几个可以同时调用的存储过程中。但是既然指定了锁,它是否仍然会导致死锁

【问题讨论】:

我想你知道死锁不会因为 1 个查询而发生?您至少需要 2 个未提交的事务 您必须提供更多上下文才能获得帮助。也许添加一些你的代码的sn-ps。 我已经更新了帖子。在几个可能导致死锁的地方使用了相同的查询。所以请协助。 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或完全其他的东西。 这是用于 SQL SERVER 【参考方案1】:

Deadlock 发生在两个或多个任务由于每个任务对其他任务试图锁定的资源的锁定而相互永久阻塞时。

由于您明确指定了with (rowlock, updlock),它在事务中添加了一个锁。最终,当一个事务正在执行时,它会在表上放置一个锁。如果另一个事务想要访问相同的记录,它必须等到前一个事务完成并移除锁才能继续。

使用with NOLOCK 可以绕过锁,但在更新的情况下,风险太大。更重要的是,正如您所提到的,可以同时执行多个更新。

在你的情况下,锁似乎是罪魁祸首。但是,锁并不是死锁的唯一来源。也可能是内存问题或线程执行。这个LINK 可能会帮助您确定死锁的真正原因。

【讨论】:

以上是关于导致死锁错误的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

更新查询在同一张表上的 Sql 查询死锁

mysql CREATE临时表+事务导致死锁

K3cloud中查询导致系统死锁的进程以及sql语句

sql查询导致错误2950

firedac odbc sql server driver连接占线导致另一个hstmt

如何从 db2 错误日志中 grep 下面的 sql 部分