2016-09-07 3 views
0

Ich habe zwei AbfrageZeile löschen und löschen Tabellensperre Orakel

1. delete from x;

2. delete from x where y='a'

welche Art der Sperre ist 11 oracle g obige Abfrage zur Verfügung stellen?

Und wenn wir die unten stehende Abfrage in einem Programm

delete from x where y='$a'

Lassen Sie eine Liste der Zahl 1,2,3,4 .. Jetzt haben laufen, wenn das gleiche Programm aus 2-Server aufgerufen wird, 1 Server löscht 1,3 ... und anderer Server löscht 2,4 ...?

+0

http://docs.oracle.com/cd/E25178_01/server.1111/e25789/consist.htm – OldProgrammer

+0

Sind beide Abfragen in verschiedenen Transaktionen? – saphsys

+0

beide unterschiedliche Transaktion abfragen – srinathshil

Antwort

1

1) Da es keine WHERE-Klausel gibt, werden alle Zeilen in der Tabelle für diese Benutzersitzung gesperrt. 2) Nur die Zeilen, die mit der WHERE-Klausel übereinstimmen, werden gesperrt. Oracle verwendet Sperren auf Zeilenebene, indem ein Sperrbit im Datenblock für diese Zeile festgelegt wird.

Außer und bis ein Commit ausgegeben wird - keine andere Sitzung wird diese Löschungen sehen. Oracle verwendet Rollback-Informationen, die für jede separate Löschanweisung (oder jede DML-Operation) erstellt werden, um eine lesungskonsistente Ansicht für jede andere Sitzung bereitzustellen. Bedeutung: Die anderen Sitzungen sehen die Tabelle ohne die Löschungen. Sobald die Zeilen gesperrt sind, wird verhindert, dass andere Sitzungen einen Löschvorgang für diese Zeilen auslösen. Der Benutzer wird blockiert und wartet darauf, dass diese Zeilen festgeschrieben oder zurückgesetzt werden. Sie können dies mit zwei sqlplus-Sitzungen testen.

Wenn Sie mehr über Schlösser wissen möchten, sehen Sie sich Tom Kytes exzellentes Buch Expert Oracle DB Architecture an.

Ja, zwei verschiedene Sitzungen können verschiedene Sätze von Zeilen löschen. Oracle führt standardmäßig keine vollständige Tabellensperrung durch (es sperrt die Tabelle während DML, um strukturelle Änderungen an dieser Tabelle zu verhindern, solange Änderungen anstehen), sodass eine Sitzung keine andere blockiert.

-1

Kein Problem. Sie können nicht vorhandene Datensätze löschen. Aber Sie dürfen Commit-Transaktion nicht vergessen.