SNAPSHOT

Transactions et gestion des erreurs dans SQL Server

Miriam Antona

Software Engineer

SNAPSHOT

  • Chaque modification est stockée dans la base tempDB
  • Ne voit que les changements validés avant le début de la transaction SNAPSHOT et ses propres changements
  • Ne voit aucun changement d'autres transactions après le début de la transaction SNAPSHOT
  • Les lectures ne bloquent pas les écritures et les écritures ne bloquent pas les lectures
  • Des conflits de mise à jour peuvent survenir
ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Transactions et gestion des erreurs dans SQL Server

SNAPSHOT - comparaison des niveaux d'isolation

Lectures sales Lectures non répétables Lectures fantômes
READ UNCOMMITTED oui oui oui
READ COMMITTED non oui oui
REPEATABLE READ non non oui
SERIALIZABLE non non non
SNAPSHOT non non non
Transactions et gestion des erreurs dans SQL Server

SNAPSHOT - exemple

Transaction1

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       |

Transaction2

...

...

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

    UPDATE accounts 
    SET current_balance = 30000 WHERE account_id = 1;

    SELECT * FROM accounts;
COMMIT TRAN

Il n'est pas bloqué !

Transactions et gestion des erreurs dans SQL Server

SNAPSHOT - exemple

Transaction1

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       |

Transaction2

...

...

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

    UPDATE accounts 
    SET current_balance = 30000 WHERE account_id = 1;

    SELECT * FROM accounts;
COMMIT TRAN

Il n'est pas bloqué !

Transactions et gestion des erreurs dans SQL Server

SNAPSHOT - récapitulatif

Avantages :

  • Bonne cohérence des données : évite les lectures sales, non répétables et fantômes sans blocage

Inconvénients :

  • Croissance de tempDB

Quand l'utiliser ? :

  • Quand la cohérence est essentielle et que vous ne voulez pas de blocages
Transactions et gestion des erreurs dans SQL Server

READ COMMITTED SNAPSHOT

  • Modifie le comportement de READ COMMITTED
ALTER DATABASE myDatabaseName SET READ_COMMITTED_SNAPSHOT {ON|OFF};
  • OFF par défaut

  • Pour activer ON :

ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
  • En ON, chaque instruction READ COMMITTED ne voit que les changements validés avant son démarrage
  • Pas de conflits de mise à jour
Transactions et gestion des erreurs dans SQL Server

READ COMMITTED SNAPSHOT - exemple

Transaction1

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

COMMIT TRAN

Transaction2

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN

    SELECT current_balance FROM accounts 
    WHERE account_id = 1;
| current_balance |
|-----------------|
| 35000,00        |
Transactions et gestion des erreurs dans SQL Server

READ COMMITTED SNAPSHOT - exemple

Transaction1

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

COMMIT TRAN

Transaction2

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        |
Transactions et gestion des erreurs dans SQL Server

WITH (NOLOCK)

  • Sert à lire des données non validées
  • READ UNCOMMITTED s'applique à toute la connexion / WITH (NOLOCK) s'applique à une table précise
  • À utiliser sous n'importe quel niveau d'isolation si vous voulez lire des données non validées sur des tables spécifiques
Transactions et gestion des erreurs dans SQL Server

WITH (NOLOCK) - exemple

Solde initial du compte 5 = 35 000 $

Transaction1

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

Transaction2

...

...

...

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

| current_balance |
|-----------------|
| 30000,00        |
Transactions et gestion des erreurs dans SQL Server

Passons à la pratique !

Transactions et gestion des erreurs dans SQL Server

Preparing Video For Download...