Jak mówi brb tea, zależy to od implementacji bazy danych i używanego przez nią algorytmu: MVCC lub Two Phase Locking.
CUBRID (open source RDBMS) wyjaśnia ideę tych dwóch algorytmów:
- Blokowanie dwufazowe (2PL)
Pierwsza z nich to gdy transakcja T2 próbuje zmienić rekord A, wie, że transakcja T1 już zmieniła rekord A i czeka, aż transakcja T1 zostanie zakończona, ponieważ transakcja T2 nie może wiedzieć, czy transakcja T1 zostanie zatwierdzona, czy rolowana plecy. Ta metoda nazywa się blokowaniem dwufazowym (2PL).
- Kontrola współbieżności wielu wersji (MVCC)
Drugim jest umożliwienie każdej z nich, transakcjom T1 i T2, własnej zmienionej wersji. Nawet jeśli transakcja T1 zmieniła rekord A z 1 na 2, transakcja T1 pozostawia pierwotną wartość 1 taką jaka jest i zapisuje, że wersja transakcji T1 rekordu A to 2. Następnie następująca transakcja T2 zmienia rekord A od 1 do 3, a nie od 2 do 4, i pisze, że wersja transakcji T2 rekordu A to 3.
Kiedy transakcja T1 jest wycofywana, nie ma znaczenia, czy 2, wersja transakcji T1, nie zostanie zastosowana do rekordu A. Następnie, jeśli transakcja T2 zostanie zatwierdzona, do rekordu A zostanie zastosowana 3, wersja transakcji T2. Jeżeli transakcja T1 została zatwierdzona przed transakcją T2, rekord A zmienia się na 2, a następnie na 3 w momencie dokonywania transakcji T2. Ostateczny status bazy danych jest identyczny ze statusem wykonywania każdej transakcji niezależnie, bez wpływu na inne transakcje. Dlatego spełnia właściwość ACID. Ta metoda nosi nazwę kontroli współbieżności wielu wersji (MVCC).
MVCC umożliwia równoczesne modyfikacje kosztem zwiększonego narzutu w pamięci (ponieważ musi utrzymywać różne wersje tych samych danych) i obliczeń (na poziomie REPETEABLE_READ nie można stracić aktualizacji, więc musi sprawdzić wersje danych, np. Hiberate robi z Optimistick Locking ).
W 2PL poziomy izolacji transakcji kontrolują :
Czy blokady są przyjmowane podczas odczytu danych i jakiego rodzaju blokady są wymagane.
Jak długo utrzymywane są blokady odczytu.
Czy operacja odczytu odwołująca się do wierszy zmodyfikowanych przez inną transakcję:
Zablokuj, aż wyłączna blokada w rzędzie zostanie zwolniona.
Pobierz zatwierdzoną wersję wiersza, która istniała w momencie rozpoczęcia instrukcji lub transakcji.
Przeczytaj niezatwierdzoną modyfikację danych.
Wybranie poziomu izolacji transakcji nie wpływa na blokady, które są uzyskiwane w celu ochrony modyfikacji danych. Transakcja zawsze uzyskuje blokadę na wyłączność dla wszystkich modyfikowanych danych i blokuje tę blokadę do zakończenia transakcji, niezależnie od poziomu izolacji ustawionego dla tej transakcji. W przypadku operacji odczytu poziomy izolacji transakcji określają przede wszystkim poziom ochrony przed skutkami modyfikacji wprowadzonych przez inne transakcje.
Niższy poziom izolacji zwiększa zdolność wielu użytkowników do uzyskiwania dostępu do danych w tym samym czasie, ale zwiększa liczbę efektów współbieżności , takich jak brudne odczyty lub utracone aktualizacje, które mogą napotkać użytkownicy.
Konkretne przykłady relacji między blokadami i poziomami izolacji w SQL Server (użyj 2PL z wyjątkiem READ_COMMITED z READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: nie wystawiaj wspólnych blokad, aby uniemożliwić innym transakcjom modyfikację danych odczytanych przez bieżącą transakcję. Transakcje READ UNCOMMITTED również nie są blokowane przez blokady na wyłączność, które uniemożliwiłyby bieżącej transakcji odczytanie wierszy, które zostały zmodyfikowane, ale nie zostały zatwierdzone przez inne transakcje. […]
READ_COMMITED:
- Jeśli READ_COMMITTED_SNAPSHOT jest ustawiona na OFF (wartość domyślna): używa wspólnych blokad, aby uniemożliwić innym transakcjom modyfikowanie wierszy, podczas gdy bieżąca transakcja wykonuje operację odczytu. Współdzielone blokady blokują również możliwość odczytu wierszy zmodyfikowanych przez inne transakcje w wyciągu do czasu zakończenia innej transakcji. [...] Blokady wierszy są zwalniane przed przetworzeniem następnego wiersza. […]
- Jeśli READ_COMMITTED_SNAPSHOT jest ustawiona na ON, Aparat baz danych używa wersjonowania wierszy, aby przedstawić każdą instrukcję z transakcyjnie spójną migawką danych, jaka istniała na początku instrukcji. Blokady nie są używane do ochrony danych przed aktualizacjami przez inne transakcje.
REPETEABLE_READ: Blokady współdzielone są nakładane na wszystkie dane odczytane przez każdą instrukcję w transakcji i są utrzymywane do zakończenia transakcji.
SERIALIZOWALNY: Blokady zakresu są umieszczane w zakresie wartości kluczy, które pasują do warunków wyszukiwania każdej instrukcji wykonanej w transakcji. […] Blokady zakresu są utrzymywane do zakończenia transakcji.