并发更新MySQL与PostgreSQL?
我们刚刚从MySQL迁移到PostgreSQL,每分钟都会有一行被大量更新。在MySQL上运行该产品的那段时间里,我们没有遇到任何问题,但在迁移到PostgreSQL之后,我们遇到了很多死锁 表结构并发更新MySQL与PostgreSQL?,mysql,sql,performance,postgresql,innodb,Mysql,Sql,Performance,Postgresql,Innodb,我们刚刚从MySQL迁移到PostgreSQL,每分钟都会有一行被大量更新。在MySQL上运行该产品的那段时间里,我们没有遇到任何问题,但在迁移到PostgreSQL之后,我们遇到了很多死锁 表结构 Create table tab(col1 int , col2 int , col3 int, PRIMARY KEY(col1)); 没有索引 死锁查询- Update tab set col2=col2+1 where col3=xx; (是,结果将有多行) 我的问题是:MySQL如何处理
Create table tab(col1 int , col2 int , col3 int, PRIMARY KEY(col1));
没有索引
死锁查询-
Update tab set col2=col2+1 where col3=xx;
(是,结果将有多行)
我的问题是:MySQL如何处理这种情况以避免死锁?(假设PostgreSQL中与此查询相关的问题是因为每次并发更新时都以不同的顺序获取行,则提出此问题)
我可能在MySQL中也遇到了死锁,但肯定不是在PostgreSQL中发生的
我已经看完了贴在网上的问题
这里发布的答案不是很有说服力,因为作者一直在抱怨PostgreSQL的更新架构和热更新
我想知道使MySQL能够避免这个问题的架构上的差异。据猜测,MySQL(可能有InnoDB表)可能每次都以一致的顺序进行更新,而PostgreSQL的访问通常是无序的。这是有道理的,因为InnoDB使用索引组织的表,而PostgreSQL使用堆
不幸的是,PostgreSQL不支持更新。。。订购人
。您可以在UPDATE
之前使用行锁,以确保可靠订购,但需额外往返,例如:
BEGIN;
SELECT 1 FROM tab WHERE col3 = xx FOR UPDATE;
UPDATE tab SET col2=col2+1 WHERE col3=xx;
COMMIT;
(我希望在PostgreSQL中提供
UPDATE…ORDER BY
支持。欢迎使用修补程序!)我不确定这是否适用于堆栈溢出,因为这里的问题是更具体的应用程序解决问题,而不是“这个应用程序是如何做到这一点的”……由于mysql是开源的,我会咨询mysql开发人员社区不确定您为什么会被否决,这是非常明智的。请参阅此处:获取扩展讨论我同意。这可能与InnoDB表始终是聚集索引这一事实有关。