Hm, lassen Sie uns alle Fälle auflisten.
REQUIRES_NEW
verschachtelt Transaktionen nicht wirklich, aber wie Sie erwähnt pausiert die aktuelle. Es gibt dann einfach zwei Transaktionen, die auf die gleichen Informationen zugreifen. (Dies ist ähnlich wie bei zwei regulären gleichzeitigen Transaktionen, außer dass sie nicht gleichzeitig, sondern im selben Ausführungsthread sind).
T1 T2 T1 T2
― ―
| |
|
― | ―
| | |
| = | |
― | ―
|
| |
― ―
Dann brauchen wir optimistisch gegen pessimistisch Verriegelung zu prüfen.
Auch müssen wir betrachten spült betrieben von ORMs. Bei ORMs haben wir keine eindeutige Kontrolle, wenn Schreibvorgänge stattfinden, da flush
vom Framework gesteuert wird. Normalerweise findet vor dem Commit ein impliziter Flush statt, aber wenn viele Einträge geändert werden, kann das Framework auch Zwischenspülungen durchführen.
1) Betrachten wir optimistisches Sperren, wo Lesen nicht Sperren erhalten, aber schreiben, exklusive Sperren zu erwerben.
Das Lesen von T1 erhält keine Sperre.
1a) Wenn T1 hat die Änderungen bündig prematurly erwarb es eine exklusive Sperre though. Wenn T2 festgeschrieben wird, versucht es, die Sperre zu erlangen, kann dies jedoch nicht. Das System ist blockiert. Dies kann von einer bestimmten Art von Deadlock sein. Die Fertigstellung hängt davon ab, wie Transaktionen oder Sperrzeiten ausfallen.
1b) Wenn T1 die Änderungen nicht bündig hat prematurly hat keine Sperre erworben. Wenn T2 commit, erwirbt und gibt es es frei und ist erfolgreich. Wenn T1 versucht, zu committen, bemerkt es einen Konflikt und schlägt fehl.
2) Lassen Sie uns pessimistische Sperren betrachten, wo lesen gemeinsame Sperren erwerben und exklusive Sperren schreiben.
Die gelesen von T1 erwerben eine gemeinsame Sperre.
2a) Wenn T1 prematurly gespült, es Turnes die Sperre INTA eine exklusive Sperre. Die Situation ist ähnlich wie 1a)
2b) Wenn T1 nicht prematurly spülte, hält T1 eine gemeinsame Sperre. Wenn T2 festschreibt, versucht es, eine exklusive Sperre zu erhalten und blockiert. Das System ist wieder blockiert.
Fazit: es ist mit optimistischem Sperren in Ordnung, wenn keine vorzeitigen Wallungen passieren, die man nicht stricly steuern.
Wie und wo erhalten Sie einen Deadlock? Aus dem Sitzungs-Cache oder aus blockierten Zeilen der Datenbank? –