Úrovně izolace transakcí

Transakce a zpracování chyb v SQL Serveru

Miriam Antona

Software Engineer

Co je souběžnost?

Souběžnost: dvě nebo více transakcí, které současně čtou nebo mění sdílená data.

Izolace transakce od ostatních transakcí

Transakce a zpracování chyb v SQL Serveru

Úrovně izolace transakcí

  • READ COMMITTED (výchozí)
  • READ UNCOMMITTED
  • REPEATABLE READ
  • SERIALIZABLE
  • SNAPSHOT
SET TRANSACTION ISOLATION LEVEL 
    {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE | SNAPSHOT}
Transakce a zpracování chyb v SQL Serveru

Zjištění aktuální úrovně izolace

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              |
Transakce a zpracování chyb v SQL Serveru

READ UNCOMMITTED

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • Nejméně restriktivní úroveň izolace
  • Čte řádky upravené jinou transakcí, která ještě nebyla potvrzena ani vrácena zpět
Transakce a zpracování chyb v SQL Serveru

READ UNCOMMITTED

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • Nejméně restriktivní úroveň izolace
  • Čte řádky upravené jinými transakcemi bez potvrzení nebo vrácení zpět.
Špinavá čtení Neopakovatelná čtení Fantómová čtení
READ UNCOMMITTED ano ano ano
Transakce a zpracování chyb v SQL Serveru

Špinavá čtení

Původní zůstatek účtu 5 = 35 000 $

Transakce1

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

ROLLBACK TRAN;

Transakce2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |
Transakce a zpracování chyb v SQL Serveru

Neopakovatelná čtení

Transakce1

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

Transakce2

...

...

BEGIN TRAN
    UPDATE accounts
    SET current_balance = 30000 WHERE account_id = 5;
COMMIT TRAN
Transakce a zpracování chyb v SQL Serveru

Neopakovatelná čtení

Transakce1

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        |

Transakce2

...

...

BEGIN TRAN
    UPDATE accounts
    SET current_balance = 30000 WHERE account_id = 5;
COMMIT TRAN
Transakce a zpracování chyb v SQL Serveru

Fantómová čtení

Transakce1

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        |

Transakce2

...

...

BEGIN TRAN
INSERT INTO accounts
    VALUES ('55555555553939393939', 1, 45000)
COMMIT TRAN
Transakce a zpracování chyb v SQL Serveru

Fantómová čtení

Transakce1

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óm!
| 55555555552020202020 |...| 50000,00        |

Transakce2

...

...

BEGIN TRAN
INSERT INTO accounts
    VALUES ('55555555553939393939', 1, 45000)
COMMIT TRAN
Transakce a zpracování chyb v SQL Serveru

READ UNCOMMITTED – shrnutí

Výhody:

  • Může být rychlejší, neblokuje ostatní transakce.

Nevýhody:

  • Umožňuje špinavá, neopakovatelná a fantómová čtení.

Kdy použít?:

  • Nechcete být blokováni jinými transakcemi a nevadí vám souběžné jevy.
  • Chcete záměrně číst nepotvrzená data.
Transakce a zpracování chyb v SQL Serveru

Lass uns üben!

Transakce a zpracování chyb v SQL Serveru

Preparing Video For Download...