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

SQL Server 2008 R2
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

SQL Server 2008 R2
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 trybie READ 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

SQL Server 2008 R2
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

SQL Server 2008 R2
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

SQL Server 2008 R2
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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow