16 Stimmen

Hibernate, Transaktionen und Tabellensperren

Wenn ich einen Code habe, der wie der folgende aussieht:

beginTransaction();
// lots of stuff happens, can take anywhere from a minute to several minutes.
// it will read from several tables via calling getter methods on lazy relationships.
commitTransaction();

Sind die Tabellen, aus denen gelesen wird, zwischen dem Beginn und der Übergabe gesperrt, und kann dies in einer Mehrbenutzerumgebung zu Problemen führen, wenn der gleiche Code von einem anderen Benutzer aufgerufen wird?

Wenn das oben genannte problematisch ist, sollten wir immer versuchen, Transaktionen kurz zu halten? und dies zu erleichtern, anstelle von Getter-Methoden auf faule Beziehungen aufrufen, bedeutet, dass seine beste, um die Transaktionen kurz zu halten und tun findet manuell für die Kinder der Eltern?

20voto

Affe Punkte 46224

Hibernate wird nichts tun, um Tabellen, aus denen Sie lesen, explizit zu sperren. Die Antwort hängt davon ab, welche Datenbank Sie verwenden und auf welche Isolationsebenen Sie eingestellt sind. Das Sperren einer gesamten Tabelle durch das Lesen von Zeilen sollte in einer vollwertigen Datenbank, die in diesem Jahrhundert geschrieben wurde, nicht vorkommen. In einer multiversionierten Datenbank wird nichts gesperrt, es sei denn, Sie sperren die Zeile ausdrücklich selbst.

Ihre Transaktionen sollten so lang sein, wie sie für Ihre atomare Arbeitseinheit erforderlich sind. Es gibt keine richtige oder falsche Länge. Fragen Sie sich: "Ist alles, was hier passiert, erfolgreich oder scheitert es als eine einzige Einheit und wird alles zusammen rückgängig gemacht, wenn eines der Teile scheitert?" Das ist der Bereich, für den Sie eine Transaktion festlegen.

Vergessen Sie nicht, dass Sie keine Transaktion benötigen, um "Lazy Loading" zu haben! Sie brauchen nur eine offene Sitzung. Die beiden sind nicht miteinander verbunden. Sie können Ihre Transaktion festschreiben und Ihre Sitzung offen lassen, damit das "Lazy Loading" funktioniert.

4voto

Aravind Yarram Punkte 76365

Am besten ist es, die Transaktionen kurz zu halten. Die Sperrsemantik hängt jedoch von den Isolationsstufen der Transaktionen ab.

Offene Sitzung In Ansicht ist das Muster, nach dem Sie suchen, wenn Sie über "Lazy-fetching/relationships" sprechen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X