Hi,
!!EDIT: Ich habe die Fehlermeldung falsch aufgefasst. "try restarting transaction" soll heißen, dass ich das selbst anstoßen muss. Nun versuche ich es so, mal schauen ob sich die Deadlocks dabei auflösen, oder ob sie sich so nicht umgehen lassen.
ich bekomme die SQL Fehlermeldung "Deadlock found when trying to get lock; try restarting transaction".
Nun bin ich am Suchen wo der Deadlock entstehen kann.
(Progge mit Java und greife auf ein InnoDB Table zu.)
Mehrere Threads machen sowas:
//Auschecken:
1. SELECT ... FOR UPDATE; => ca. 20 Locks
2. BATCH: UPDATE alle eben ausgecheckten; => Locks weg
//3. Arbeiten
4. //einchecken:
BATCH: UPDATE nun die bearbeiteten
Alles in BATCH ist eine Transaktion.
Ist es möglich, dass ein Deadlock auftritt, wenn nun bei Threads irgendwo versuchen auf den gleichen Datensatz zuzugreifen? DAZU muss ich sagen: Auschecken bedeutet, dass sobald das SELECT und anschließend das UPDATE durch sind, wird dieser Datensatz von anderen SELECTs ausgeschlossen ist (durch ein "WHERE checked_out is null").
Sieht jemand wo ein Deadlock auftreten kann? Mir ist es absolut nicht klar, da jedes Update den Lock entfernt, und jedes Select, welches einen gelockten Datensatz lesen will einfach wartet (sollte so sein, werde das aber noch verifizieren), bis das vorherige select beendet ist.
!!EDIT: Ich habe die Fehlermeldung falsch aufgefasst. "try restarting transaction" soll heißen, dass ich das selbst anstoßen muss. Nun versuche ich es so, mal schauen ob sich die Deadlocks dabei auflösen, oder ob sie sich so nicht umgehen lassen.
ich bekomme die SQL Fehlermeldung "Deadlock found when trying to get lock; try restarting transaction".
Nun bin ich am Suchen wo der Deadlock entstehen kann.
(Progge mit Java und greife auf ein InnoDB Table zu.)
Mehrere Threads machen sowas:
//Auschecken:
1. SELECT ... FOR UPDATE; => ca. 20 Locks
2. BATCH: UPDATE alle eben ausgecheckten; => Locks weg
//3. Arbeiten
4. //einchecken:
BATCH: UPDATE nun die bearbeiteten
Alles in BATCH ist eine Transaktion.
Ist es möglich, dass ein Deadlock auftritt, wenn nun bei Threads irgendwo versuchen auf den gleichen Datensatz zuzugreifen? DAZU muss ich sagen: Auschecken bedeutet, dass sobald das SELECT und anschließend das UPDATE durch sind, wird dieser Datensatz von anderen SELECTs ausgeschlossen ist (durch ein "WHERE checked_out is null").
Sieht jemand wo ein Deadlock auftreten kann? Mir ist es absolut nicht klar, da jedes Update den Lock entfernt, und jedes Select, welches einen gelockten Datensatz lesen will einfach wartet (sollte so sein, werde das aber noch verifizieren), bis das vorherige select beendet ist.