2016-11-17 6 views
1

Wir haben gerade von MySQL nach PostgreSQL migriert, eine bestimmte Zeile für jede Minute wird stark aktualisiert werden. In all den Jahren, in denen das Produkt in MySQL lief, hatten wir keine Probleme, aber als wir nach PostgreSQL wechselten, waren wir mit so vielen Deadlocks konfrontiert.Concurrent update MySQL vs PostgreSQL?

Tabellenstruktur.

Create table tab(col1 int , col2 int , col3 int, PRIMARY KEY(col1)); 

Kein Index.

Deadlock-Abfrage -

Update tab set col2=col2+1 where col3=xx; 

(ja, es wird mehr als eine Zeile für Folge sein).

Meine Frage: Wie hat MySQL diese Situation gehandhabt, um Deadlocks zu vermeiden? (Stellen Sie sich diese Frage, wenn Sie davon ausgehen, dass das Problem in PostgreSQL in Bezug auf diese Abfrage darauf zurückzuführen ist, dass die Zeilen bei jeder zeitgleichen Aktualisierung in unterschiedlicher Reihenfolge abgerufen werden).

Ich hätte vielleicht auch in MySQL mit Deadlocks zu tun gehabt, aber definitiv nicht in dem Ausmaß, wie es mit PostgreSQL passiert ist.

Und ich habe bereits die Frage in https://dba.stackexchange.com/questions/151813/why-can-mysql-handle-multiple-updates-concurrently-and-postgresql-cant durchgegangen die Antwort hier gepostet war nicht sehr überzeugend, als der Autor ging über die Update-Architektur von PostgreSQL und HOT Updates beschwert.

Ich möchte den Unterschied in der Architektur wissen, die es MySQL ermöglicht, dieses Problem zu vermeiden.

+0

Ich bin nicht sicher, ob dies angemessen ist, einen Überlauf zu stapeln entweder als die Fragen, hier sind konkrete Anwendungslösung Probleme nicht " Wie macht diese Anwendung das? ... als mysql ist open source Ich würde die mysql Entwickler-Community konsultieren – MageeWorld

+0

Unsicher, warum Sie downvotes bekommen, das ist ziemlich vernünftig. –

+0

Siehe hier: http://dba.stackexchange.com/q/151813/1822 für eine erweiterte Diskussion –

Antwort

1

Vermutlich führt MySQL (vermutlich mit InnoDB -Tabellen) die Aktualisierungen wahrscheinlich in einer konsistenten Reihenfolge durch, während der Zugriff von PostgreSQL generell ungeordnet ist. Dies ist sinnvoll, da InnoDB Index-organisierte Tabellen verwendet, während PostgreSQL Heaps verwendet.

PostgreSQL unterstützt leider nicht UPDATE ... ORDER BY. Sie können eine Reihensperre vor Ihnen vornehmen, um eine zuverlässige Bestellung auf Kosten einer zusätzlichen Hin- und Rückfahrt, z.

BEGIN; 
SELECT 1 FROM tab WHERE col3 = xx FOR UPDATE; 
UPDATE tab SET col2=col2+1 WHERE col3=xx; 
COMMIT; 

(ich würde gerne UPDATE ... ORDER BY Unterstützung in PostgreSQL. Patches willkommen haben!)

+0

Ich stimme zu. Das liegt wahrscheinlich daran, dass InnoDB-Tabellen immer ein Clustered-Index sind. –