SNAPSHOT

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

Miriam Antona

Software Engineer

SNAPSHOT

  • Her değişiklik tempDB veritabanında tutulur
  • Yalnızca SNAPSHOT işlemi başlamadan önceki onaylı değişiklikleri ve kendi değişikliklerinizi görürsünüz
  • SNAPSHOT başladıktan sonra diğer işlemlerin yaptığı değişiklikleri göremezsiniz
  • Okumalar yazmaları, yazmalar okumaları engellemez
  • Güncelleme çakışmaları olabilir
ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SQL Server'da İşlemler ve Hata Yönetimi

SNAPSHOT - yalıtım seviyesi karşılaştırması

Kirli okumalar Yinelenemeyen 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
SNAPSHOT hayır hayır hayır
SQL Server'da İşlemler ve Hata Yönetimi

SNAPSHOT - örnek

İşlem1

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

BEGIN TRAN
    SELECT * FROM accounts;
|account_id|account_number      |...| current_balance|
|----------|--------------------|---|----------------|
|1         |55555555551234567890|...| 25000,00       |
|2         |55555555559876543210|...| 200,00         |
|...       |...                 |...| ...            |
|15        |55555555551234567890|...| 25000,00       |

İşlem2

...

...

BEGIN TRAN
    INSERT INTO accounts
    VALUES (11111111111111111111, 1, 25000);

    UPDATE accounts 
    SET current_balance = 30000 WHERE account_id = 1;

    SELECT * FROM accounts;
COMMIT TRAN

Engellenmez!

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

SNAPSHOT - örnek

İşlem1

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

BEGIN TRAN
    SELECT * FROM accounts;
    SELECT * FROM accounts;
|account_id|account_number      |...| current_balance|
|----------|--------------------|---|----------------|
|1         |55555555551234567890|...| 25000,00       |
|2         |55555555559876543210|...| 200,00         |
|...       |...                 |...| ...            |
|15        |55555555551234567890|...| 25000,00       |

İşlem2

...

...

BEGIN TRAN
    INSERT INTO accounts
    VALUES (11111111111111111111, 1, 25000);

    UPDATE accounts 
    SET current_balance = 30000 WHERE account_id = 1;

    SELECT * FROM accounts;
COMMIT TRAN

Engellenmez!

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

SNAPSHOT - özet

Artıları:

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

Eksileri:

  • tempDB artar

Ne zaman kullanılır?:

  • Veri tutarlılığı şartsa ve bloklar istemiyorsanız
SQL Server'da İşlemler ve Hata Yönetimi

READ COMMITTED SNAPSHOT

  • READ COMMITTED davranışını değiştirir
ALTER DATABASE myDatabaseName SET READ_COMMITTED_SNAPSHOT {ON|OFF};
  • Varsayılan OFF

  • ON kullanmak için:

ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
  • ON iken, her READ COMMITTED ifadesi yalnızca ifadenin başlangıcından önce gerçekleşen onaylı değişiklikleri görür
  • Güncelleme çakışmaları olmaz
SQL Server'da İşlemler ve Hata Yönetimi

READ COMMITTED SNAPSHOT - örnek

İşlem1

 SET TRANSACTION ISOLATION LEVEL READ COMMITTED
 BEGIN TRAN 
   UPDATE accounts
   SET current_balance = 30000
   WHERE account_id = 1;

COMMIT TRAN

İşlem2

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN

    SELECT current_balance FROM accounts 
    WHERE account_id = 1;
| current_balance |
|-----------------|
| 35000,00        |
SQL Server'da İşlemler ve Hata Yönetimi

READ COMMITTED SNAPSHOT - örnek

İşlem1

 SET TRANSACTION ISOLATION LEVEL READ COMMITTED
 BEGIN TRAN 
   UPDATE accounts
   SET current_balance = 30000
   WHERE account_id = 1;

COMMIT TRAN

İşlem2

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN

    SELECT current_balance FROM accounts 
    WHERE account_id = 1;
    SELECT current_balance FROM accounts 
    WHERE account_id = 1;
| current_balance |
|-----------------|
| 30000,00        |
SQL Server'da İşlemler ve Hata Yönetimi

WITH (NOLOCK)

  • Onaylanmamış veriyi okumak için kullanılır
  • READ UNCOMMITTED tüm bağlantıya uygulanır / WITH (NOLOCK) belirli bir tabloya uygulanır
  • Belirli tablolardan yalnızca onaylanmamış veri okumak istediğinizde, herhangi bir yalıtım seviyesinde kullanın
SQL Server'da İşlemler ve Hata Yönetimi

WITH (NOLOCK) - örnek

Hesap 5'in ilk bakiyesi = $35.000

İşlem1

BEGIN TRAN
  UPDATE accounts
  SET current_balance = 30000
  WHERE account_id = 5;

İşlem2

...

...

...

SELECT current_balance
FROM accounts WITH (NOLOCK) 
WHERE account_id = 5;

| current_balance |
|-----------------|
| 30000,00        |
SQL Server'da İşlemler ve Hata Yönetimi

Hadi pratik yapalım!

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

Preparing Video For Download...