Ich versuche, einige Teile des MERGE
MySQL-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 UPDATE
versuchen INSERT
es dann und wenn es einen 23xxx Integritätsfehler verursacht, versuchen Sie stattdessen ein UPDATE. Deadlocks. Wir haben die FOR UPDATE
cos 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 COMMITTED
eine 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, SUPER
noch 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 KEY
ist weder vielseitig genug noch Deadlock- frei.
So was jetzt?
MERGE
befreit 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.