SERIALIZABLE izolasyon seviyesi

SQL Server'da İşlemler ve Hata Yönetimi

Miriam Antona

Software Engineer

SERIALIZABLE

  • En kısıtlayıcı izolasyon seviyesi
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SQL Server'da İşlemler ve Hata Yönetimi

İzolasyon seviyelerinin karşılaştırması

Kirli okumalar Tekrar edilemeyen okumalar Hayalet okumalar
READ UNCOMMITTED evet evet evet
READ COMMITTED hayır evet evet
REPEATABLE READ hayır hayır evet
SERIALIZABLE hayır hayır hayır
SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE ile kayıt kilitleme

  • İndeks aralığına dayalı WHERE koşullu sorgu -> Yalnızca o kayıtları kilitler
  • İndeks aralığına dayalı olmayan sorgu -> Tüm tabloyu kilitler
SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - indeks aralığına dayalı sorgu

İşlem 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers
    WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------|-----|-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |

Kilitli kayıt

SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - indeks aralığına dayalı sorgu

İşlem 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers
    WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------|-----|-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |

Kilitli kayıt

İşlem 2

...

...

INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);

Beklemek zorunda!

SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - indeks aralığına dayalı sorgu

İşlem 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;

    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------|-----|-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |

İşlem 2

...

...

INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);

Beklemek zorunda!

SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - indeks aralığına dayalı sorgu

İşlem 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;

    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;
COMMIT TRAN

İşlem 2

...

...

INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);

Akhirinde çalıştı!

SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - indeks aralığına dayalı sorgu

İşlem 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------|-----|-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |

İşlem 2

...

...

INSERT INTO customers (customer_id, first_name, ...)
VALUES (200, 'Phantom', 'Ph', '[email protected]', 555666222);

Anında eklendi!

SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - indeks aralığına dayalı olmayan sorgu

İşlem 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
    SELECT * FROM customers;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------| ... |-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |
...
| 10          | Carol      | York      | ... | 555148988 |

Tüm tabloyu kilitler

İşlem 2

...

...

INSERT INTO customers
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);

Beklemek zorunda!

SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - indeks aralığına dayalı olmayan sorgu

İşlem 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
    SELECT * FROM customers;

    SELECT * FROM customers;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------| ... |-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |
...
| 10          | Carol      | York      | ... | 555148988 |

İşlem 2

...

...

INSERT INTO customers
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);

Beklemek zorunda!

SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - indeks aralığına dayalı olmayan sorgu

İşlem 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
    SELECT * FROM customers;

    SELECT * FROM customers;
COMMIT TRAN

İşlem 2

...

...

INSERT INTO customers 
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);

Akhirinde çalıştı!

SQL Server'da İşlemler ve Hata Yönetimi

SERIALIZABLE - özet

Artılar:

  • İyi veri tutarlılığı: kirli, tekrar edilemeyen ve hayalet okumaları önler

Eksiler:

  • SERIALIZABLE bir işlem tarafından engellenebilirsiniz

Ne zaman kullanılır?:

  • Veri tutarlılığı zorunlu olduğunda
SQL Server'da İşlemler ve Hata Yönetimi

Hadi pratik yapalım!

SQL Server'da İşlemler ve Hata Yönetimi

Preparing Video For Download...