Deadlock-frei MERGE-Alike in MySQL?

7

Ich versuche, einige Teile des MERGEMySQL-Treibers in Drupal zu implementieren . Natürlich hat Drupal etwas, aber in Wahrheit funktioniert es nur, weil der häufigste MERGE-Emittent nur Ausnahmen isst.

Was auch immer wir versuchen, es treten Deadlocks auf. Was wir tun, wir starten eine Transaktion, SELECT ... FOR UPDATEversuchen INSERTes dann und wenn es einen 23xxx Integritätsfehler verursacht, versuchen Sie stattdessen ein UPDATE. Deadlocks. Wir haben die FOR UPDATEcos entfernt, die wir entschieden haben, dass es für unsere Verwendung in Ordnung ist. Immer noch Deadlocks.

Ich kann nicht einfach die Isolationsstufe wechseln, da READ COMMITTEDeine Zeilenprotokollierung gemäß SET TRANSACTION erforderlich ist :

Wenn Sie ab MySQL 5.1 READ COMMITTED [...] verwenden, müssen Sie die zeilenbasierte binäre Protokollierung verwenden.

Und laut READ UNCOMMITTED muss auch die Zeilenprotokollierung erfolgen . Und hier kommt die binäre Protokolleinstellung :

Um den globalen Wert für binlog_format zu ändern, müssen Sie über die Berechtigung SUPER verfügen. Dies gilt auch für den Sitzungswert ab MySQL 5.1.29.

Ich kann nicht jedes Drupal-Setup benötigen, SUPERnoch können wir sagen, dass Drupal nicht mit anweisungsbasierten Binlogs kompatibel ist, wenn dies die Standardeinstellung und die am weitesten verbreitete ist.

INSERT ... ON DUPLICATE KEYist weder vielseitig genug noch Deadlock- frei.

So was jetzt?

chx
quelle
Unter api.drupal.org/api/drupal/… finden Sie unsere Merge-API / Implementierung. Es ist nicht erforderlich, dass Sie tatsächlich über einen eindeutigen Schlüssel verfügen, und Sie können unterschiedliche Verhaltensweisen für das Aktualisieren / Einfügen angeben.
Berdir
4
MERGEbefreit Sie nicht von Deadlocks (Erfahrung von DBMS, die es implementiert haben). Und ich kann nicht erkennen, was mit dem Umgang mit Deadlocks nicht stimmt. Wann immer Sie Transaktionen haben, müssen Sie berücksichtigen, dass Deadlocks auftreten können.
Ypercubeᵀᴹ
1
Es müssen einige zirkuläre Aktualisierungen vorhanden sein, damit eine Deadlock-Bedingung auftritt. Die Art der Abfrage würde dies nicht verursachen, sondern die spezifischen Aktualisierungen, die durchgeführt werden.
Andrew Brennan

Antworten:

1

Wenn möglich, schreiben Sie eine gespeicherte Prozedur, um die gesamte Aufgabe zu kapseln. Und mit Ausnahmen umgehen. Dann lassen Sie Drupal den SP anrufen.

Rick James
quelle
0

In Bezug auf die folgende Aussage:

Um den globalen Wert für binlog_format zu ändern, müssen Sie über die Berechtigung SUPER verfügen. Dies gilt auch für den Sitzungswert ab MySQL 5.1.29.

Sie müssen Drupal keine SUPER-Berechtigung erteilen, da die obige Anweisung nur gilt, wenn Sie das binäre Protokollformat zur Laufzeit ändern möchten.

Folgendes müssen Sie tun:

Sie können das binäre Protokollierungsformat explizit auswählen, indem Sie den MySQL-Server mit --binlog-format = type starten.

Weitere Informationen zum Festlegen des Binärprotokollformats finden Sie im MySQL-Handbuch.

dabest1
quelle
Aber genau das müssen wir tun - der Drupal-Site-Besitzer ist nicht immer der Server-Besitzer.
chx