Ich habe über 4 Isolationsstufen gelesen:
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --
Ich möchte die Sperre verstehen, die jede Transaktionsisolation für die Tabelle übernimmt
READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)
Im Folgenden sind die drei Phänomene aufgeführt, die bei der Transaktionsisolation auftreten können.
Dirty Read - keine Sperre
Nonrepeatable Read - kein Dirty Read als Sperre für festgeschriebene Daten
Phantom Read - Sperre für einen SQL-Block (der mithilfe der Auswahlabfrage ausgewählt wird)
Ich möchte verstehen, wo wir diese Isolationsstufen definieren: nur auf jdbc / hibernate-Ebene oder auch in DB
PS: Ich habe die Links in den Isolationsstufen in Oracle durchgesehen , aber sie sehen ungeschickt aus und sprechen datenbankspezifisch
java
transactions
isolation-level
Lerner
quelle
quelle
Antworten:
Sie haben beispielsweise drei gleichzeitige Prozesse A, B und C. A startet eine Transaktion, schreibt Daten und schreibt fest / rollt (abhängig von den Ergebnissen). B führt nur eine
SELECT
Anweisung aus, um Daten zu lesen. C liest und aktualisiert Daten. Alle diese Prozesse arbeiten an derselben Tabelle T.WHERE aField > 10 AND aField < 20
A fügt Daten ein, bei denen deraField
Wert zwischen 10 und 20 liegt, dann liest B die Daten erneut und erhält ein anderes Ergebnis.Mit JDBC definieren Sie es mit
Connection#setTransactionIsolation
.Verwenden des Ruhezustands:
Wo
Die Konfiguration für den Ruhezustand wird von hier aus übernommen (Entschuldigung, es ist auf Spanisch).
Übrigens können Sie die Isolationsstufe auch für RDBMS festlegen:
SET ISOLATION TO DIRTY READ
Satz nie vergessen .)und weiter und weiter...
quelle
Wie brb tea sagt, hängt dies von der Datenbankimplementierung und dem verwendeten Algorithmus ab: MVCC oder Two Phase Locking.
CUBRID (Open Source RDBMS) erklärt die Idee dieser beiden Algorithmen:
Das MVCC ermöglicht gleichzeitige Änderungen auf Kosten eines erhöhten Speicheraufwands (da unterschiedliche Versionen derselben Daten verwaltet werden müssen) und einer Berechnung (auf der Ebene REPETEABLE_READ können Sie keine Updates verlieren, sodass die Versionen der Daten wie Hiberate überprüft werden müssen macht mit Optimistick Locking ).
In 2PL Transaktionsisolationsstufen steuern Sie Folgendes :
Konkrete Beispiele für die Beziehung zwischen Sperren und Isolationsstufen in SQL Server (verwenden Sie 2PL außer bei READ_COMMITED mit READ_COMMITTED_SNAPSHOT = ON).
READ_UNCOMMITED: Geben Sie keine gemeinsam genutzten Sperren aus, um zu verhindern, dass andere Transaktionen die von der aktuellen Transaktion gelesenen Daten ändern. READ UNCOMMITTED-Transaktionen werden auch nicht durch exklusive Sperren blockiert, die verhindern würden, dass die aktuelle Transaktion Zeilen liest, die geändert, aber nicht von anderen Transaktionen festgeschrieben wurden. [...]
READ_COMMITED:
REPETEABLE_READ: Gemeinsame Sperren für alle Daten, die von jeder Anweisung in der Transaktion gelesen werden, werden gehalten, bis die Transaktion abgeschlossen ist.
SERIALIZABLE: Bereichssperren werden in den Bereich der Schlüsselwerte eingefügt, die den Suchbedingungen jeder in einer Transaktion ausgeführten Anweisung entsprechen. [...] Die Bereichssperren werden gehalten, bis die Transaktion abgeschlossen ist.
quelle
Die Sperren werden immer auf DB-Ebene genommen: -
Offizielles Oracle-Dokument: - Um Konflikte während einer Transaktion zu vermeiden, verwendet ein DBMS Sperren, Mechanismen, um den Zugriff anderer auf die Daten zu blockieren, auf die die Transaktion zugreift. (Beachten Sie, dass im Auto-Commit-Modus, in dem jede Anweisung eine Transaktion ist, Sperren nur für eine Anweisung gehalten werden.) Nachdem eine Sperre gesetzt wurde, bleibt sie in Kraft, bis die Transaktion festgeschrieben oder zurückgesetzt wird. Beispielsweise könnte ein DBMS eine Zeile einer Tabelle sperren, bis Aktualisierungen festgeschrieben wurden. Die Wirkung dieser Sperre besteht darin, zu verhindern, dass ein Benutzer einen fehlerhaften Lesevorgang erhält, dh einen Wert liest, bevor er dauerhaft gemacht wird. (Der Zugriff auf einen aktualisierten Wert, der nicht festgeschrieben wurde, wird als fehlerhafter Lesevorgang angesehen, da dieser Wert möglicherweise auf den vorherigen Wert zurückgesetzt werden kann. Wenn Sie einen Wert lesen, der später zurückgesetzt wird, haben Sie einen ungültigen Wert gelesen. )
Wie Sperren gesetzt werden, hängt von der sogenannten Transaktionsisolationsstufe ab, die von der Nichtunterstützung von Transaktionen bis zur Unterstützung von Transaktionen reichen kann, die sehr strenge Zugriffsregeln erzwingen.
Ein Beispiel für eine Transaktionsisolationsstufe ist TRANSACTION_READ_COMMITTED, mit der erst nach dem Festschreiben auf einen Wert zugegriffen werden kann. Mit anderen Worten, wenn die Transaktionsisolationsstufe auf TRANSACTION_READ_COMMITTED festgelegt ist, lässt das DBMS keine schmutzigen Lesevorgänge zu. Die Schnittstellenverbindung enthält fünf Werte, die die Transaktionsisolationsstufen darstellen, die Sie in JDBC verwenden können.
quelle