[英]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.