Es gibt in SQL ein SELECT FOR UPDATE
(MariaDB, Postgres), was man in Transaktionen benutzen kann, um schon frühzeitig zu sagen, dass man die entsprechenden Zeilen updaten wird, damit sie schon direkt gelockt werden können. Dadurch kann verhindert werden, dass Transaktionen unnötig neu versucht werden müssen.
Man kann sich mit einer SQL-DB ja eine Task-/Message-Queue für Arme bauen. Das ist besonders dann eine mögliche Lösung, wenn man noch kein ein Queuing-System hat oder die Anzahl an Messages pro Sekunde überschaubar ist.
In diesem Fall kann man nicht nur SELECT FOR UPDATE
verwenden, sondern auch zusätzlich noch SKIP LOCKED
. Durch das SELECT FOR UPDATE
wird ja nicht verhindert, dass sich ein anderer Worker die Nachricht zusätzlich noch holt. Mit SELECT FOR UPDATE SKIP LOCKED
kann man die Zeilen überspringen, die gerade in einer Transaktion sind.