当前位置: 首页 > 知识库问答 >
问题:

Postgresql->来自简单更新的死锁。我找不到原因

和和裕
2023-03-14

以下是表格(简化):

                                       Table "public.link"
    Column     |            Type             |                     Modifiers                     
---------------+-----------------------------+---------------------------------------------------
 id            | integer                     | not null default nextval('link_id_seq'::regclass)
 page_id       | integer                     | 
 placed_at     | timestamp without time zone | default now()
Indexes:
    "link_pkey" PRIMARY KEY, btree (id)
    "link_page_id_index" btree (page_id)
Foreign-key constraints:
    "link_page_id_foreign_key" FOREIGN KEY (page_id) REFERENCES page(id) ON UPDATE RESTRICT ON DELETE RESTRICT

以下是查询(简化):

UPDATE link SET page_id = ?, placed_at = now() 
WHERE id IN ( SELECT id FROM link ... ) AND page_id IS NOT NULL

死锁消息:

ERROR: deadlock detected
  Detail: Process 5822 waits for ShareLock on transaction 19705; blocked by process 5821.
Process 5821 waits for ShareLock on transaction 19706; blocked by process 5822.
  Hint: See server log for query details.

由多个进程并行执行的查询如何导致死锁
谢谢!

共有2个答案

胥诚
2023-03-14

在大多数情况下,死锁的出现是因为行之间的循环等待将被更新,所以如果你想解决死锁,你可以简单地对你想更新的行进行排序

UPDATE link SET page_id = ?, placed_at = now() 
WHERE id IN ( SELECT id FROM link ... order by page_id ) AND page_id IS NOT NULL
刘建中
2023-03-14

会话A尝试更新id10, 2, 30, 4会话B尝试40, 30, 20, 10

他们都试图锁定各自的行以备更新,A得到10并等待30,而B得到30并等待10。僵局

您的基本问题是,您试图在并发事务中更新(某些)相同的ID。

如果不知道你的数据库结构和你想做什么,很难提出最好的解决方案。通常,你要么确保不同的后端不会更新相同的行,要么减少超时,在随机暂停后重试。

 类似资料:
  • 主要内容:死锁的必要条件每个进程都需要一些资源来完成它的执行。 但是,该资源是按顺序授予的。 该进程请求一些资源。 如果可用,操作系统会授予资源,否则请等待进程。 该过程使用它并在完成时释放。 死锁是每个计算机进程等待分配给另一个进程的资源的情况。在这种情况下,由于它所需的资源不被执行,因此其他进程也在等待其他资源被释放。 假设有三个进程P1,P2和P3。有三种不同的资源R1,R2和R3。 R1分配给P1,R2分配给P2

  • 死锁的Magento1.8比1.7少,但仍然不时出现.. 关于如何通过这个问题,任何人都有一些好主意。 130930 12:03:35*(1)事务:事务918EEC3B,活动37秒开始索引读取使用中的mysql表1,锁定1锁等待41锁结构,堆大小6960,50个行锁,撤消日志条目6 MySQL线程id 51899,操作系统线程句柄0x7F9774169700,查询id 2583719 xxx.xx

  • 问题内容: 与多个用户一起测试我的应用程序时,我遇到了ORA-00060死锁错误。我不确定如何确定此错误的原因,因此,如果有人可以帮助我,将不胜感激。 我查看了为此事件生成的跟踪文件,它显示了导致此问题的查询: 它也产生了这个: 我如何使用以上信息来找出导致问题的原因?TABLE_A或TABLE_B上都没有任何未索引的外键(我相信这通常是导致这种类型错误的原因)。 当我运行此查询时: 我在完全不同

  • 我在使用PostgreSQL 9.3。我是唯一一个处理数据库的人,我的代码按顺序运行单元测试的查询。 大多数情况下,以下更新查询运行正常,但有时会锁定PostgreSQL server。然后,查询似乎永远不会结束,而通常只需要3秒钟。我必须确定查询在单元测试上下文中运行,即数据完全相同,而锁是否发生。代码是唯一更新数据的进程。 我知道在对自更新表使用更新查询时,PostgreSQL可能存在锁问题。

  • 我有一个已经运行了几周的Kubernetes1.11集群。今天我注意到: null

  • Maven告诉我:您的过滤器与任何原型都不匹配。我的系统: null 我已采取的步骤是: Create my project Navigate to my project in command prompt and run the command: cd返回到“我的项目”文件夹并运行命令 运行该命令后,我会看到: