繁体   English   中英

为什么MySQL InnoDB可以处理并发更新而PostgreSQL无法处理?

[英]Why MySQL InnoDB can handle concurrent updates and PostgreSQL can't?

假设您有一个具有以下定义的表:

CREATE TABLE public.positions
(
   id serial,
   latitude numeric(18,12),
   longitude numeric(18,12),
   updated_at timestamp without time zone
)

这样的表中有50,000行。 现在出于测试目的,您将运行以下更新:

update positions
set  updated_at = now()
where latitude between 234.12 and 235.00;

该语句将更新50,000条中的1,000行(在此特定数据集中)

如果您在30个不同的线程中运行此类查询,则MySQL innodb将成功,而postgres将失败,并出现大量死锁。

为什么?

我会说过去的运气平淡。

如果继续执行三十个线程并希望更新相同的1000行,则它们可以以相同的顺序(在这种情况下它们将彼此锁定并依次执行)或以不同的顺序(在这种情况下它们将死锁)访问这些行。 )。

InnoDB和PostgreSQL都是一样的。

要分析为什么情况不同的原因,您应该先比较执行计划。 也许然后您可能会发现为什么PostgreSQL不按相同顺序访问所有行。

缺少此信息,我想您正在体验8.3版中引入的一项功能,功能可以加速并发顺序扫描:

  • 并发大型顺序扫描现在可以共享磁盘读取(Jeff Davis)

    这是通过在表的中间开始新的顺序扫描(已经在进行另一个顺序扫描)并从头到尾完成来完成的。 这可能会影响未指定ORDER BY的查询中返回行的顺序。 如有必要,可以使用synchronize_seqscans配置参数禁用此功能。

检查您的PostgreSQL执行计划是否使用顺序扫描,并查看是否更改synchronize_seqscans可以避免死锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM