我们刚刚从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如何处理这种情况以避免死锁?(假设PostgreSQL中与此查询相关的问题是因为每次发生并发更新时按不同的顺序获取行,则提出此问题)。
我可能在MySQL中也遇到过死锁,但绝对不是PostgreSQL的死锁。
我已经完成了https://dba.stackexchange.com/questions/151813/why-can-mysql-handle-multiple-updates-concurrently-and-postgresql-cant中的问题
本文给出的答案并不十分令人信服,因为作者一直在抱怨PostgreSQL的更新架构和热更新。
我想知道MySQL避免这个问题的架构的不同。
最佳答案
据猜测,MySQL(可能是InnoDB表)每次更新的顺序都是一致的,而PostgreSQL的访问通常是无序的。这是有意义的,因为InnoDB使用索引组织的表,而PostgreSQL使用堆。
不幸的是,PostgreSQL不支持UPDATE ... ORDER BY
。您可以在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与PostgreSQL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40645416/