Microsoft SQL Server
Poziomy izolacji transakcji
Szukaj…
Składnia
- USTAW POZIOM IZOLACJI TRANSAKCJI {CZYTAJ NIEDOZWOLONE | PRZECZYTAJ ZAANGAŻOWANE | POWTARZANE CZYTANIE | SNAPSHOT | SERIALIZABLE} [; ]
Uwagi
Odniesienie MSDN: USTAW POZIOM IZOLACJI TRANSAKCJI
Czytaj Nieprzyjęte
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Jest to najbardziej dopuszczalny poziom izolacji, ponieważ nie powoduje żadnych blokad. Określa, że instrukcje mogą czytać wszystkie wiersze, w tym wiersze, które zostały zapisane w transakcjach, ale jeszcze nie zostały zatwierdzone (tj. Nadal są w transakcji). Ten poziom izolacji może podlegać „brudnym odczytom”.
Czytaj Zaangażowane
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Ten poziom izolacji jest 2. najbardziej tolerancyjnym. Zapobiega brudnym odczytom. Zachowanie READ COMMITTED
zależy od ustawienia READ_COMMITTED_SNAPSHOT
:
Jeśli ustawiono na WYŁ. (Ustawienie domyślne), transakcja korzysta ze współdzielonych blokad, aby uniemożliwić innym transakcjom modyfikowanie wierszy używanych przez bieżącą transakcję, a także zablokowanie bieżącej transakcji odczytywania wierszy zmodyfikowanych przez inne transakcje.
Jeśli ustawiono na WŁĄCZ, podpowiedzi tabeli
READCOMMITTEDLOCK
można użyć do żądania współdzielonego blokowania zamiast wersji wiersza dla transakcji uruchomionych w trybieREAD COMMITTED
.
Uwaga: READ COMMITTED
to domyślne zachowanie programu SQL Server.
Co to są „brudne odczyty”?
Brudne odczyty (lub nieprzypisane odczyty) to odczyty wierszy, które są modyfikowane przez otwartą transakcję.
To zachowanie można replikować za pomocą 2 oddzielnych zapytań: jednego do otwarcia transakcji i zapisania niektórych danych do tabeli bez zobowiązania, drugiego do wybrania danych do zapisania (ale jeszcze nie zatwierdzonych) przy tym poziomie izolacji.
Zapytanie 1 - Przygotuj transakcję, ale jej nie dokończ:
CREATE TABLE dbo.demo (
col1 INT,
col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here
Zapytanie 2 - Przeczytaj wiersze, w tym otwartą transakcję:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;
Zwroty:
col1 col2 ----------- --------------------------------------- 99 Normal transaction 42 Dirty read
PS: Nie zapomnij wyczyścić tych danych demonstracyjnych:
COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO
Powtarzalne czytanie
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
Ten poziom izolacji transakcji jest nieco mniej dopuszczalny niż READ COMMITTED
, ponieważ wspólne blokady są umieszczane na wszystkich danych odczytywanych przez każdą instrukcję w transakcji i są utrzymywane do czasu zakończenia transakcji , w przeciwieństwie do zwolnienia po każdym wyciągu.
Uwaga: Z tej opcji należy korzystać tylko wtedy, gdy jest to konieczne, ponieważ bardziej prawdopodobne jest pogorszenie wydajności bazy danych oraz zakleszczenia niż w przypadku READ COMMITTED
.
Migawka
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Określa, że dane odczytywane przez dowolne instrukcje w transakcji będą zgodną pod względem transakcyjnym wersją danych, które istniały na początku transakcji, tj. Będą czytać tylko dane, które zostały zatwierdzone przed rozpoczęciem transakcji.
Transakcje SNAPSHOT
nie żądają ani nie powodują blokady danych, które są odczytywane, ponieważ odczytuje tylko wersję (lub migawkę) danych, które istniały w momencie rozpoczęcia transakcji.
Transakcja działająca na poziomie izolacji SNAPSHOT
odczytuje tylko własne zmiany danych podczas działania. Na przykład transakcja może zaktualizować niektóre wiersze, a następnie odczytać zaktualizowane wiersze, ale ta zmiana będzie widoczna tylko dla bieżącej transakcji, dopóki nie zostanie zatwierdzona.
Uwaga: ALLOW_SNAPSHOT_ISOLATION
bazy danych ALLOW_SNAPSHOT_ISOLATION
musi być ustawiona na ON, aby można było użyć poziomu izolacji SNAPSHOT
.
Serializowalny
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE
Ten poziom izolacji jest najbardziej restrykcyjny. Żąda zakresu blokuje zakres kluczowych wartości, które są odczytywane przez każdą instrukcję w transakcji. Oznacza to również, że INSERT
z innych transakcji zostaną zablokowane, jeśli wiersze do wstawienia znajdują się w zakresie zablokowanym przez bieżącą transakcję.
Ta opcja ma taki sam efekt jak ustawienie HOLDLOCK
we wszystkich tabelach we wszystkich instrukcjach SELECT
w transakcji.
Uwaga: ta izolacja transakcji ma najniższą współbieżność i powinna być używana tylko w razie potrzeby.