Domyślnie Oracle używa poziomu wiersza zamki.
Te blokady są blokowane tylko dla autorów (aktualizacja, usuwanie, wstawianie itp.). Oznacza to, że wybór będzie działał przez cały czas, gdy tabela jest mocno aktualizowana, usuwana z itp.
Na przykład niech będzie tableA(numer col1, numer col2) z następującymi danymi:
col1 | col2
1 | 10
2 | 20
3 | 30
Jeśli użytkownik Jan zgłosi problem w time1
:
update tableA set col2=11 where col1=1;
zablokuje wiersz 1.
O time2
użytkownik Oznacz wystawienie
update tableA set col2=22 where col1=2;
aktualizacja zadziała, ponieważ wiersz 2 nie jest zablokowany.
Teraz tabela wygląda w bazie danych:
col1 | col2
1 | 11 --locked by john
2 | 22 --locked by mark
3 | 30
Dla tabeli Marka jest (nie widzi zmian niezatwierdzonych)
col1 | col2
1 | 10
2 | 22
3 | 30
Dla Johna tabela to:(nie widzi niezatwierdzonych zmian)
col1 | col2
1 | 11
2 | 20
3 | 30
Jeśli mark próbuje o time3
:
update tableA set col2=12 where col1=1;
jego sesja zostanie zawieszona do time4
kiedy Jan wyda commit
.(Wycofanie również odblokuje wiersze, ale zmiany zostaną utracone)
tabela jest (w db, w czasie 4):
col1 | col2
1 | 11
2 | 22 --locked by mark
3 | 30
Natychmiast po zatwierdzeniu przez Johna wiersz 1 jest odblokowany, a aktualizacja Marka wykona zadanie:
col1 | col2
1 | 12 --locked by mark
2 | 22 --locked by mark
3 | 30
oznaczmy wydanie rollbaku w czasie5:
col1 | col2
1 | 11
2 | 20
3 | 30
Wstawianie jest prostsze, ponieważ wstawiane wiersze są zablokowane, ale także nie są widoczne dla innych użytkowników, ponieważ nie są zatwierdzone. Kiedy użytkownik zatwierdzi, zwalnia również blokady, aby inni użytkownicy mogli przeglądać te wiersze, aktualizować je lub usuwać.
EDYTUJ :Jak wyjaśnił Jeffrey Kemp, gdy masz PK (jest zaimplementowany w Oracle z unikalnym indeksem), jeśli użytkownicy spróbują wstawić tę samą wartość (więc mielibyśmy duplikat), blokowanie nastąpi w indeks . Druga sesja zostanie zablokowana do czasu zakończenia pierwszej sesji, ponieważ próbuje pisać w tym samym miejscu. Jeśli pierwsza sesja zostanie zatwierdzona, druga zgłosi wyjątek dotyczący naruszenia klucza podstawowego i nie zmieni bazy danych. Jeśli pierwsza sesja zostanie wycofana, druga zakończy się pomyślnie (jeśli nie pojawi się żaden inny problem).
(Uwaga:w tym wyjaśnieniu użytkownika John mam na myśli sesję rozpoczętą przez użytkownika John).