Niveaux d'isolement des transactions

Transactions et gestion des erreurs dans SQL Server

Miriam Antona

Software Engineer

Qu'est‑ce que la concurrence ?

Concurrence : deux transactions ou plus lisent/modifient en même temps des données partagées.

Isoler notre transaction des autres

Transactions et gestion des erreurs dans SQL Server

Niveaux d'isolement des transactions

  • READ COMMITTED (par défaut)
  • READ UNCOMMITTED
  • REPEATABLE READ
  • SERIALIZABLE
  • SNAPSHOT
SET TRANSACTION ISOLATION LEVEL 
    {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE | SNAPSHOT}
Transactions et gestion des erreurs dans SQL Server

Connaître le niveau d'isolement actuel

SELECT CASE transaction_isolation_level 
    WHEN 0 THEN 'UNSPECIFIED' 
    WHEN 1 THEN 'READ UNCOMMITTED' 
    WHEN 2 THEN 'READ COMMITTED' 
    WHEN 3 THEN 'REPEATABLE READ ' 
    WHEN 4 THEN 'SERIALIZABLE' 
    WHEN 5 THEN 'SNAPSHOT' 
END AS transaction_isolation_level 
FROM sys.dm_exec_sessions 
WHERE session_id = @@SPID
| transaction_isolation_level |
|-----------------------------|
| READ COMMITTED              |
Transactions et gestion des erreurs dans SQL Server

READ UNCOMMITTED

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • Niveau d'isolement le moins restrictif
  • Lire des lignes modifiées par une autre transaction qui n'est pas encore validée ni annulée
Transactions et gestion des erreurs dans SQL Server

READ UNCOMMITTED

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • Niveau d'isolement le moins restrictif
  • Lire des lignes modifiées par d'autres transactions sans être validées/annulées.
Lectures sales Lectures non répétables Lectures fantômes
READ UNCOMMITTED oui oui oui
Transactions et gestion des erreurs dans SQL Server

Lectures sales (dirty reads)

Solde initial du compte 5 = 35 000 $

Transaction 1

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

ROLLBACK TRAN;

Transaction 2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |
Transactions et gestion des erreurs dans SQL Server

Lectures non répétables

Transaction 1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
    SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |

Transaction 2

...

...

BEGIN TRAN
    UPDATE accounts
    SET current_balance = 30000 WHERE account_id = 5;
COMMIT TRAN
Transactions et gestion des erreurs dans SQL Server

Lectures non répétables

Transaction 1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
    SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |
    SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |

Transaction 2

...

...

BEGIN TRAN
    UPDATE accounts
    SET current_balance = 30000 WHERE account_id = 5;
COMMIT TRAN
Transactions et gestion des erreurs dans SQL Server

Lectures fantômes

Transaction 1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
SELECT * FROM accounts
    WHERE current_balance BETWEEN 45000 AND 50000
| account_number       | ... | current_balance |
|----------------------|-----|-----------------|
| 55555555552020202020 | ... | 50000,00        |

Transaction 2

...

...

BEGIN TRAN
INSERT INTO accounts
    VALUES ('55555555553939393939', 1, 45000)
COMMIT TRAN
Transactions et gestion des erreurs dans SQL Server

Lectures fantômes

Transaction 1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
SELECT * FROM accounts 
    WHERE current_balance BETWEEN 45000 AND 50000
| account_number       | ... | current_balance |
|----------------------|-----|-----------------|
| 55555555552020202020 | ... | 50000,00        | 
SELECT * FROM accounts 
    WHERE current_balance BETWEEN 45000 AND 50000
| account_number       |...| current_balance |
|----------------------|---|-----------------|
| 55555555553939393939 |...| 45000,00        | Fantôme !
| 55555555552020202020 |...| 50000,00        |

Transaction 2

...

...

BEGIN TRAN
INSERT INTO accounts
    VALUES ('55555555553939393939', 1, 45000)
COMMIT TRAN
Transactions et gestion des erreurs dans SQL Server

READ UNCOMMITTED – résumé

Avantages :

  • Plus rapide, ne bloque pas les autres transactions.

Inconvénients :

  • Permet les lectures sales, non répétables et fantômes.

Quand l'utiliser ?

  • Ne pas être bloqué par d'autres transactions et accepter les phénomènes de concurrence.
  • Vous souhaitez explicitement voir des données non validées.
Transactions et gestion des erreurs dans SQL Server

Passons à la pratique !

Transactions et gestion des erreurs dans SQL Server

Preparing Video For Download...