Ich benutze diese Abfrage Zeilen zwischen konkurrierenden Arbeitern zu verteilen:Warum verursacht diese Abfrage einen Deadlock?
SET @update_id := 0;
UPDATE tablename
SET processed = -1, id = (SELECT @update_id := id)
WHERE processed = 0
LIMIT 1
SELECT @update_id as id;
Manchmal warf sie auf eine Deadlock Ausnahme und ich habe es gerade neu gestartet. Aber mit einer ausreichend hohen Anzahl von Arbeitskräften beginnt es fast immer mit der Deadlock-Operation und bleibt in der Wiederholungsschleife hängen. Wie man es richtig umschreibt?
Sind Sie sicher, dass dies richtig funktionieren sollte? Was passiert, wenn die Zeile nach der Auswahl der Unterabfrage geändert wird, aber bevor die Aktualisierung erfolgt? Soll ich den Rückgabewert überprüfen und die Abfrage neu starten, wenn 0 Zeilen geändert werden? – Poma
'UND verarbeitete = 0' sollte es verhindern. Ja, wenn 0 Zeilen geändert werden oder 0 zurückgegeben wird, sollten Sie die Abfrage neu starten. Möglicherweise müssen Sie hinzufügen, dass es eine Zeile mit "processed = 0" gibt, so dass Sie keine Endlosschleife haben. Alternative Vorgehensweise ist, ProcessId anstelle von -1 setzen, dann könnte es Dinge vereinfachen, in jedem Fall müssen Sie mit abgestürzten Prozessen beschäftigen. 'update tn set verarbeitet = wo verarbeitet = 0 Limit 1; Wählen Sie ID aus TN, wo verarbeitet = ' –
' Allgemeiner Fehler: 1093 Sie können Zieltabelle 'Tabellenname' für die Aktualisierung in FROM-Klausel nicht angeben – Poma