Warum hat Oracle kein Nolock?

14

In MS SQL Server nolockkann zu diesem Zweck verwendet werden.

Warum können wir es nicht in Oracle und plsql verwenden?

sal
quelle

Antworten:

20

SQL Server verwendet normalerweise eine andere Sperrstrategie als Oracle. Die von SQL Server verwendete Standardstrategie bedeutet, dass bei der Auswahl von Zeilen Lesesperren (für Zeilen, Seiten oder die gesamte Tabelle) auf diese angewendet werden *. Daher NOLOCKist die Klausel manchmal nützlich - obwohl der allgemeine Ratschlag lautet, sie niemals zu verwenden, da sie die Semantik der Isolationsstufen ändert und zu inkonsistenten Ergebnissen in der Ausgabe der Abfragen führen kann.

* (Hinweis: Dies ist die Standardeinstellung. Wenn die SNAPSHOTIsolation ausgewählt ist, ist das Verhalten anders und Leser blockieren keine Schreiber.)

In Oracle blockiert ein Lesevorgang niemals einen Schreibvorgang. Das Folgende ist ein Auszug aus ' Oracle Database Concepts 11g Release 2 '. Ich empfehle Ihnen einen Blick darauf zu werfen, ob Sie daran interessiert sind, wie dies von Oracle gehandhabt wird.

Datengleichzeitigkeit und -konsistenz

Zusammenfassung des Sperrverhaltens

In der Datenbank werden abhängig von der Operation, die die Sperre erworben hat, verschiedene Arten von Sperren verwaltet. Im Allgemeinen verwendet die Datenbank zwei Arten von Sperren: exklusive Sperren und Freigabesperren. Für eine Ressource, z. B. eine Zeile oder eine Tabelle, kann nur eine exklusive Sperre abgerufen werden, für eine einzelne Ressource können jedoch viele Freigabesperren abgerufen werden.

Sperren beeinflussen die Interaktion von Lesern und Schreibern. Ein Reader ist eine Abfrage einer Ressource, während ein Writer eine Anweisung ist, die eine Ressource ändert. Die folgenden Regeln fassen das Sperrverhalten von Oracle Database für Leser und Schreiber zusammen:

• Eine Zeile ist nur gesperrt, wenn sie von einem Schreiber geändert wurde.

Wenn eine Anweisung eine Zeile aktualisiert, erhält die Transaktion eine Sperre nur für diese Zeile. Durch das Sperren von Tabellendaten auf Zeilenebene minimiert die Datenbank Konflikte um dieselben Daten. Unter normalen Umständen 1 eskaliert die Datenbank keine Zeilensperre auf die Block- oder Tabellenebene.

• Ein Schreiber einer Zeile blockiert einen gleichzeitigen Schreiber derselben Zeile.

Wenn eine Transaktion eine Zeile ändert, verhindert eine Zeilensperre, dass eine andere Transaktion dieselbe Zeile gleichzeitig ändert.

• Ein Leser blockiert niemals einen Schreiber.

Da ein Leser einer Zeile diese nicht sperrt, kann ein Schreiber diese Zeile ändern. Die einzige Ausnahme ist eine SELECT ... FOR UPDATE-Anweisung, eine spezielle SELECT-Anweisung, die die gelesene Zeile sperrt.

• Ein Autor blockiert niemals einen Leser.

Wenn eine Zeile von einem Schreiber geändert wird, verwendet die Datenbank Undo-Daten, um Lesern eine konsistente Ansicht der Zeile zu bieten.

BriteSponge
quelle