In Db2 können wir sagen, dass wir Daten in eine Tabelle t1 einfügen. Gleichzeitig versucht ein anderer Prozess, Daten aus der Tabelle zu kürzen. Wird das Abschneiden warten, bis die Einfügung abgeschlossen ist? Oder besteht die Gefahr von DeadlocksINSERT UND TRUNCATE
Antwort
Sie sollten eine Tabellensperre anfordern, bevor Sie das Abschneiden ausführen.
Wenn Sie dies tun, können Sie keine Deadlock erhalten - die Tabellensperre wird nicht gewährt, bevor die Einfügung beendet ist und sobald Sie die Sperre haben, kann eine andere Einfügung nicht auftreten.
Sie können den Befehl LOCK TABLE verwenden. Die Details hängen von Ihrer Situation ab, aber Sie sollten auch mit dem SHARED-Modus durchkommen können. Dies ermöglicht Lesevorgänge, aber keine Einfügungen (dies ist das Problem, das Sie haben, glaube ich.)
Es ist möglich, dass dies Ihr Problem nicht beheben wird. Das bedeutet wahrscheinlich, dass Ihre insert-Anweisung zu kompliziert ist - vielleicht liest sie aus einer Reihe anderer Tabellen oder aus einer föderierten Tabelle. Wenn dies der Fall ist, re-architect Ihre Lösung um eine Staging-Tabelle (zuerst in die Staging-Tabelle einfügen .. langsam .. dann in die Zieltabelle aus der Staging-Tabelle einfügen).
Als Erstes würde ich jedes Design in Frage stellen, bei dem ein Prozess eine Tabelle abschneidet, während ein anderer Datensätze einfügt.
Zweitens gibt es keine Chance von Deadlocks gegeben, was Sie beschrieben haben. Möglicherweise erhalten Sie eine Meldung "Objekt in Verwendung" (wahrscheinlich SQL-Status = 57033). Aber das ist nicht dasselbe wie ein Deadlock.
Ein Deadlock tritt auf, wenn P1 T1 und P2 T2 sperrt. Dann versucht P1, T2 zu sperren, während P2 T1 zu sperren versucht. Beide Prozesse warten nun darauf, dass die anderen abgeschlossen werden, bevor sie fortfahren können. T1 und T2 könnten Tabellen, Datensätze, jede Ressource wirklich sein.
Selbst in einem Deadlock-Szenario sollten die meisten Prozesse nur bereit sein, eine bestimmte Zeit für eine Ressource zu warten. Vor dem Abbrechen und erneut versuchen. Deadlock ist nur ein Problem, wenn beide Prozesse bereit sind, für immer zu warten. Jetzt muss Ihr RDBMS diesen Deadlock erkennen und einen Prozess zum Töten auswählen.