database-locking

___ qstntxt ___

Wenn ich versuche, etwas in eine db-Tabelle einzufügen / zu aktualisieren, sperrt Oracle die gesamte Tabelle oder nur die Zeile, die eingefügt / aktualisiert wird?

Ist das etwas, das durch externe Konfiguration gesteuert werden kann?

    
___ answer23336999 ___

Wenn eine reguläre DML ausgeführt wird (UPDATE / DELETE / INSERT, MERGE und SELECT ... FOR UPDATE), erhält oracle 2 Sperren. Row level Lock (TX) - Dadurch wird eine Sperre für die betreffende Zeile erhalten, und jede andere Transaktion, die versucht, dieselbe Zeile zu ändern, wird blockiert, bis die bereits besetzte Zeile beendet wird. Table Level Lock (TM) - Wenn Zeilensperre (TX) erreicht wird, wird auch eine zusätzliche Tabellensperre erhalten, um zu verhindern, dass DDL-Operationen während einer DML ausgeführt werden.

Entscheidend ist jedoch, in welchem ​​Modus die Tabellensperre erhalten wird. Eine Zeilenfreigabesperre (RS), die auch als Teilfreigabetabellensperre (SS) bezeichnet wird, gibt an, dass die Transaktion, die die Sperre für die Tabelle enthält, Zeilen in der Tabelle gesperrt hat und beabsichtigt, sie zu aktualisieren. Eine SS-Sperre ist der am wenigsten einschränkende Modus der Tabellensperre und bietet den höchsten Grad an Parallelität für eine Tabelle.

Eine Zeilenexklusivsperre (RX), auch als unterexklusive Tabellensperre (SX) bezeichnet, gibt an, dass die Transaktion, die die Sperre enthält, Tabellenzeilen aktualisiert oder SELECT ... FOR UPDATE ausgegeben hat. Eine SX-Sperre ermöglicht es anderen Transaktionen, Zeilen in derselben Tabelle abzufragen, einzufügen, zu aktualisieren, zu löschen oder zu sperren. Daher ermöglichen SX-Sperren mehreren Transaktionen gleichzeitige SX- und SS-Sperren für die gleiche Tabelle zu erhalten.

Eine Freigabe-Tabellensperre (S), die von einer Transaktion gehalten wird, ermöglicht anderen Transaktionen, die Tabelle abzufragen (ohne SELECT ... FOR UPDATE zu verwenden), erlaubt jedoch nur Aktualisierungen, wenn eine einzelne Transaktion die Freigabe-Tabellensperre hält. Mehrere Transaktionen können gleichzeitig eine Freigabetabellensperre enthalten, sodass das Halten dieser Sperre nicht ausreicht, um sicherzustellen, dass eine Transaktion die Tabelle ändern kann.

Eine Freigabe-Zeilen-exklusive Tabellensperre (SRX), die auch als Freigabe-Unterschließungs-Tabellensperre (SSX) bezeichnet wird, ist restriktiver als eine Freigabe-Tabellensperre. Es kann immer nur eine Transaktion eine SSX-Sperre für eine bestimmte Tabelle erfassen. Eine SSX-Sperre, die von einer Transaktion gehalten wird, ermöglicht anderen Transaktionen, die Tabelle abzufragen (außer SELECT ... FOR UPDATE), aber die Tabelle nicht zu aktualisieren.

Eine exklusive Tabellensperre (X) ist der restriktivste Modus der Tabellensperre und erlaubt der Transaktion, die den schreibgeschützten Schreibzugriff auf die Tabelle hält. Nur eine Transaktion kann eine X-Sperre für eine Tabelle erhalten.

    
___ tag123oracle11g ___ Oracle ist ein objektbezogenes Datenbankverwaltungssystem (ORDBMS), das von Oracle Corporation erstellt wurde. Bestimmte Versionen des Produkts sind als Oracle9i, Oracle10g, Oracle 11g und Oracle 12c bekannt, wobei "i", "g" und "c" für "internet", "grid" bzw. "cloud" stehen. Im Allgemeinen gibt es zwei Versionen innerhalb jeder Hauptversion. Für Fragen, die mit [oracle11g] getaggt wurden, wird angenommen, dass sie spezifisch für diese Version oder die in dieser Version eingeführten Funktionen sind. ___ tag123database-locking ___ hilf uns, dieses Wiki zu bearbeiten ___ answer18021531 ___

Wir können Sperren explizit mit dem LOCK TABLE-Befehl ausgeben. Erfahren Sie mehr

Andernfalls sperrt eine Einfügung keine anderen Zeilen. Aufgrund des Lese-Isolationsmodells von Oracle existiert diese Zeile nur in unserer Sitzung, bis wir sie festgeschrieben haben, damit niemand anders damit etwas anfangen kann. Erfahren Sie mehr .

Eine Update-Anweisung sperrt nur die betroffenen Zeilen. Es sei denn, wir haben eine pessimistische Sperrstrategie mit SELECT ... FOR UPDATE implementiert. Erfahren Sie mehr .

Schließlich, in Oracle-Autoren blockieren keine Leser. So können sogar gesperrte Zeilen von anderen Sitzungen gelesen werden, sie können einfach nicht geändert werden. Erfahren Sie mehr .

Dieses Verhalten ist in den Oracle-Kernel eingebettet und kann nicht konfiguriert werden.

Justin macht einen guten Punkt bezüglich der DDL-Sperre auf Tabellenebene. Diese Sperre führt dazu, dass eine Sitzung, die DDL in der Tabelle ausführt, wartet, bis die DML-Sitzung festgeschrieben wird, es sei denn, die DDL ähnelt CREATE INDEX. In diesem Fall wird sie sofort mit ORA-00054 fehlschlagen.

    
___ answer19697831 ___

Sie sollten wahrscheinlich das Orakel-Konzepthandbuch zum Sperren lesen. Für Standard-DML-Operationen (Einfügen, Aktualisieren, Löschen, Zusammenführen) verwendet Oracle eine gemeinsame DML-Sperre (Typ TM). Dadurch können andere DMLs in der Tabelle gleichzeitig ausgeführt werden (eine Freigabesperre). Zeilen, die durch eine Aktualisierung geändert oder die DML-Operation gelöscht wurden und noch nicht festgeschrieben wurden, verfügen über eine exklusive Zeilensperre (Typ TX). Eine andere DML-Operation in einer anderen Sitzung / Transaktion kann auf der Tabelle ausgeführt werden, aber wenn sie die gleiche Zeile ändert, wird sie blockiert, bis der Inhaber der Zeilensperre sie entweder durch Festschreiben oder Zurückrollen freigibt.

Parallele DML-Operationen und Operationen zum direkten Einfügen von seriellem Insert erfordern exklusive Tabellensperren.

    
___ qstnhdr ___ Wird Oracle die gesamte Tabelle sperren, während eine DML-Anweisung oder nur die Zeile ausgeführt wird? ___ answer18021525 ___

Es hängt davon ab, was Sie mit "Sperre" meinen.

Bei 99,9% dessen, was Menschen wahrscheinlich interessiert, erhält Oracle eine Sperre auf Zeilenebene, wenn eine Zeile geändert wird. Die Sperre auf Zeilenebene erlaubt es den Lesern immer noch, die Zeile zu lesen (wegen der Lesekonsistenz bei mehreren Versionen blockieren die Schreiber niemals die Leser, und die Leser machen keine schmutzigen Lesevorgänge).

Wenn Sie in %code% herumstochern, sehen Sie, dass beim Aktualisieren einer Zeile auch eine Sperre für die Tabelle aufgehoben wird. Diese Sperre verhindert jedoch nur, dass eine andere Sitzung DDL für die Tabelle ausführt. Da Sie DDL praktisch nie in einer aktiven Tabelle ausführen möchten, ist dies in der Regel nichts, was dazu führen würde, dass eine andere Sitzung auf die Sperre wartet.

    
___
4
Antworten

Wird Oracle die gesamte Tabelle sperren, während eine DML-Anweisung oder nur die Zeile ausgeführt wird?

Wenn ich versuche, etwas in eine db-Tabelle einzufügen / zu aktualisieren, sperrt Oracle die gesamte Tabelle oder nur die Zeile, die eingefügt / aktualisiert wird? Ist das etwas, das durch externe Konfiguration gesteuert werden kann?     
02.08.2013, 16:04
3
Antworten

Wie sperre ich eine InnoDB-Zeile, die noch nicht existiert?

Wie kann ich garantieren, dass ich suchen kann, wenn ein Benutzername in meiner Datenbank existiert, und diesen Benutzernamen dann als neue Zeile in die Datenbank einfügen, ohne dass zwischen den Anweisungen SELECT und INSERT abgefangen wi...
12.06.2013, 14:55