我使用PostgreSQL 9.2,并且我不在任何地方使用显式锁定,既不使用LOCK语句也不使用SELECT ... FOR UPDATE 但是,最近我收到了ERROR: 40P01: deadlock detected 检测到死锁的查询虽然包含在事务块中。 无论如何,怎么回事?

===============>>#1 票数:6 已采纳

您不需要任何明确的LOCK就可以进入死锁状态。 这是一个非常简单的演示,从头开始只有INSERT:

create table a(i int primary key);
create table b(i int primary key);

会话#1做:

begin;
insert into a values(1);

然后会话#2做:

begin;
insert into b values(1);
insert into a values(1);
-- here it goes into waiting for session #1 to finish its transaction

然后会话#1做:

insert into b values(1);

然后发生死锁:

错误:检测到死锁
详细信息:进程9571在事务4150上等待ShareLock; 被进程9501阻止。
过程9501在事务4149上等待ShareLock; 被进程9571阻止。
提示:有关查询详细信息,请参阅服务器日志

简单的UPDATE或UPDATE和INSERT的组合也可能发生同样的情况。 这些操作采用隐式锁定,如果它们以不同的顺序发生在不同的会话中,它们可能会死锁。

===============>>#2 票数:2

我首先怀疑哈希索引。

  • 将您拥有的任何hash索引切换到B-tree
  • 如果合适,请使用Serializable隔离级别。

  ask by zapadlo translate from so

未解决问题?本站智能推荐:

2回复

Postgres并发upserts死锁

我们有一个应用程序,它从数据流中读取并将该信息存储到数据库中。 数据是Google云端硬盘上发生的变化,这意味着影响相同对象的许多事件可能会彼此非常接近。 将此信息上传到数据库时,我们遇到了死锁,这是日志中的内容。 我重新构建并清理了查询的可读性: 架构: 我怀疑问题是
1回复

运行UPDATE时PostgreSQL中的死锁

关于PostgreSQL死锁,我有点困惑。 典型的死锁示例是: 但是,如果我更改代码如下: 这可能会陷入僵局吗? 基本上我的问题是: 在第二种情况下,PostgreSQL会逐行锁定行,还是锁定WHERE条件所涵盖的整个范围? 提前致谢!
1回复

在PostgreSQL中进行postmortem死锁调试

我想在PostgreSQL死锁中收集关于“赢家”事务和“输家”事务的事后调试信息。 我发现这个 wiki页面包含了一些很好的实时视图,可以提供有关当前出错的提示,但是如果我理解正确,那么当丢失的事务已经被回滚时,大部分最有用的信息将被删除从这些实时视图。 我看到了诸如deadl
1回复

什么是财务运作中的锁定,死锁问题?

子查询SQL-何时应使用“ with(nolock)” 在一家本地金融机构中,我对他们的程序员表示谴责,因为他们表达了我的观点:(他们的程序员的痴迷)(b)将问题锁定在他们的MS SQL Server 2005数据库中对我来说没有多大意义。 通过从未在数据库中插入(添加)新的更正记录
1回复

如何避免Postgres的死锁?

我运行多个服务器,每个服务器都运行多个更新语句,例如这些 如果有一个如下的续订更新: 然后我将deadlock detected到的错误deadlock detected 现在,我的修复是在客户端订购更新语句,并始终保证id的顺序相同。 即我总是ASC by user_i
1回复

MySQL:事务隔离级别,死锁

我有一个长期运行的过程导入产品,并不时出现死锁错误。 根据我的知识,我认为如果在脚本执行期间我将隔离级别切换到Serializable我将解决死锁问题。 但是,我能做什么,我可以打开2个终端并使用Serializable重现死锁。 好吧,之后我用READ UNCOMMITED尝试了d
2回复

如果以相同的顺序访问对象,如何发生死锁?

在关于“最小化死锁”的MS Technet页面上 ,它说“无法完全避免死锁”。 更具体地说,它表明了这一点 如果所有并发事务以相同顺序访问对象,则不太可能发生死锁。 这意味着即使所有事务以相同的顺序访问对象,理论上也可能发生死锁。 有人可以举例说明如何做到这一点吗?
1回复

了解如何处理InnoDB中的死锁及其回滚

过去,我主要将MyISAM用作存储引擎,而最近才更多地使用InnoDB 。 现在我真的开始使用InnoDB的locking和isolation levels 。 我一直在阅读的文档和我所关心的是,一件事情它指出 : InnoDB自动检测事务死锁并回滚一个或多个事务以打破死锁。
3回复

只有一个资源和隔离级别可序列化的死锁…?

我使用实体框架,因此可以处理长时间运行的任务(平均10到30秒)。 我有许多工作程序实例,每个工作程序都从数据库表中获取下一个任务ID,并由此获取该ID的工作描述。 当然,必须对任务表的访问进行序列化,以使来自工作进程的每个请求都获得一个新的ID。 我以为这样可以做到: 不幸的
1回复

如何防止并发事务中的数据库死锁?

场景: 交易A开始... 同时,交易B开始... 现在,事务B正在等待行1,该行已锁定在事务A中。 交易A继续... 现在我们有了死锁,因此两个事务都在等待彼此解锁要更新的行:'( 正如我在标题中所问的那样,我们如何防止RDBMS事务中的死锁? 我