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?
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.