SNAPSHOT

Tranzacții și gestionarea erorilor în SQL Server

Miriam Antona

Software Engineer

SNAPSHOT

  • Fiecare modificare este stocată în baza de date tempDB
  • Vizualizează doar modificările confirmate înainte de începerea tranzacției SNAPSHOT și propriile modificări
  • Nu vede modificările făcute de alte tranzacții după startul tranzacției SNAPSHOT
  • Citirile nu blochează scrierile și scrierile nu blochează citirile
  • Pot apărea conflicte de actualizare
ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Tranzacții și gestionarea erorilor în SQL Server

SNAPSHOT - comparație niveluri de izolare

Citiri murdare Citiri nerepetabile Citiri fantomă
READ UNCOMMITTED da da da
READ COMMITTED nu da da
REPEATABLE READ nu nu da
SERIALIZABLE nu nu nu
SNAPSHOT nu nu nu
Tranzacții și gestionarea erorilor în SQL Server

SNAPSHOT - exemplu

Tranzacția 1

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       |

Tranzacția 2

...

...

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

    UPDATE accounts 
    SET current_balance = 30000 WHERE account_id = 1;

    SELECT * FROM accounts;
COMMIT TRAN

Nu este blocată!

Tranzacții și gestionarea erorilor în SQL Server

SNAPSHOT - exemplu

Tranzacția 1

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       |

Tranzacția 2

...

...

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

    UPDATE accounts 
    SET current_balance = 30000 WHERE account_id = 1;

    SELECT * FROM accounts;
COMMIT TRAN

Nu este blocată!

Tranzacții și gestionarea erorilor în SQL Server

SNAPSHOT - rezumat

Avantaje:

  • Consistență bună a datelor: Previne citirile murdare, nerepetabile și fantomă fără blocare

Dezavantaje:

  • tempDB crește

Când se utilizează?:

  • Când consistența datelor este esențială și nu se doresc blocări
Tranzacții și gestionarea erorilor în SQL Server

READ COMMITTED SNAPSHOT

  • Modifică comportamentul READ COMMITTED
ALTER DATABASE myDatabaseName SET READ_COMMITTED_SNAPSHOT {ON|OFF};
  • Implicit OFF

  • Pentru a utiliza ON:

ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
  • Setat pe ON, face ca fiecare instrucțiune READ COMMITTED să vadă doar modificările confirmate înainte de începerea instrucțiunii
  • Nu pot apărea conflicte de actualizare
Tranzacții și gestionarea erorilor în SQL Server

READ COMMITTED SNAPSHOT - exemplu

Tranzacția 1

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

COMMIT TRAN

Tranzacția 2

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN

    SELECT current_balance FROM accounts 
    WHERE account_id = 1;
| current_balance |
|-----------------|
| 35000,00        |
Tranzacții și gestionarea erorilor în SQL Server

READ COMMITTED SNAPSHOT - exemplu

Tranzacția 1

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

COMMIT TRAN

Tranzacția 2

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        |
Tranzacții și gestionarea erorilor în SQL Server

WITH (NOLOCK)

  • Utilizat pentru citirea datelor neconfirmate
  • READ UNCOMMITTED se aplică întregii conexiuni / WITH (NOLOCK) se aplică unui tabel specific
  • Folosiți sub orice nivel de izolare când doriți să citiți date neconfirmate din tabele specifice
Tranzacții și gestionarea erorilor în SQL Server

WITH (NOLOCK) - exemplu

Soldul inițial al contului 5 = $35.000

Tranzacția 1

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

Tranzacția 2

...

...

...

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

| current_balance |
|-----------------|
| 30000,00        |
Tranzacții și gestionarea erorilor în SQL Server

Să exersăm!

Tranzacții și gestionarea erorilor în SQL Server

Preparing Video For Download...