Przeczytałem o 4 poziomach izolacji:
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --
Chcę zrozumieć blokadę, jaką przyjmuje każda izolacja transakcji na stole
READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)
poniżej przedstawiono trzy zjawiska, które mogą wystąpić w izolacji transakcji
Brudny odczyt - brak blokady
Niepowtarzalny odczyt - brak brudnego odczytu jako blokady
zatwierdzonych danych
Odczyt fantomowy - blokada bloku sql (który jest wybierany przy użyciu zapytania wybierającego)
Chcę zrozumieć, gdzie definiujemy te poziomy izolacji: tylko na poziomie jdbc / hibernacji lub również w DB
PS: Przeszedłem przez linki w Poziomach izolacji w wyroczni , ale wyglądają niezgrabnie i mówią o specyficznych dla bazy danych
Odpowiedzi:
Na przykład masz 3 równoczesne procesy A, B i C. A rozpoczyna transakcję, zapisuje dane i zatwierdza / wycofuje (w zależności od wyników). B po prostu wykonuje
SELECT
polecenie w celu odczytania danych. C czyta i aktualizuje dane. Wszystkie te procesy działają na tej samej tabeli T.WHERE aField > 10 AND aField < 20
A wstawia dane, którychaField
wartość zawiera się między 10 a 20, a następnie B odczytuje dane ponownie i uzyskuje inny wynik.Używając JDBC, definiujesz go za pomocą
Connection#setTransactionIsolation
.Korzystanie z hibernacji:
Gdzie
Konfiguracja hibernacji jest pobierana stąd (przepraszam, jest w języku hiszpańskim).
Nawiasem mówiąc, możesz ustawić poziom izolacji również w RDBMS:
SET ISOLATION TO DIRTY READ
zdaniu).i tak dalej...
źródło
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:
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ą :
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:
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.
źródło
Blokady są zawsze pobierane na poziomie DB: -
Oficjalny dokument Oracle: - Aby uniknąć konfliktów podczas transakcji, DBMS używa blokad, mechanizmów blokowania dostępu innych osób do danych, do których ma dostęp transakcja. (Należy zauważyć, że w trybie automatycznego zatwierdzania, w którym każda instrukcja jest transakcją, blokady są utrzymywane tylko dla jednej instrukcji.) Po ustawieniu blokady pozostaje ona w mocy do momentu zatwierdzenia lub wycofania transakcji. Na przykład DBMS może zablokować wiersz tabeli do czasu zatwierdzenia aktualizacji. Efektem tej blokady byłoby zapobieżenie odczytaniu przez użytkownika brudnego odczytu, to znaczy odczytaniu wartości, zanim zostanie ona utrwalona. (Dostęp do zaktualizowanej wartości, która nie została zatwierdzona, jest uważany za brudny odczyt, ponieważ istnieje możliwość przywrócenia tej wartości do jej poprzedniej wartości. Jeśli odczytasz wartość, która jest później wycofywana, odczytasz nieprawidłową wartość. )
Sposób ustawiania blokad jest określany przez tak zwany poziom izolacji transakcji, który może wahać się od braku obsługi transakcji do obsługi transakcji, które wymuszają bardzo rygorystyczne zasady dostępu.
Jednym z przykładów poziomu izolacji transakcji jest TRANSACTION_READ_COMMITTED, który umożliwi dostęp do wartości dopiero po jej zatwierdzeniu. Innymi słowy, jeśli poziom izolacji transakcji jest ustawiony na TRANSACTION_READ_COMMITTED, DBMS nie zezwala na występowanie brudnych odczytów. Interfejs Connection zawiera pięć wartości, które reprezentują poziomy izolacji transakcji, których można używać w JDBC.
źródło