Livello di isolamento SERIALIZABLE

Transazioni e gestione degli errori in SQL Server

Miriam Antona

Software Engineer

SERIALIZABLE

  • Livello di isolamento più restrittivo
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Transazioni e gestione degli errori in SQL Server

Confronto dei livelli di isolamento

Dirty reads Non-repeatable reads Phantom reads
READ UNCOMMITTED yes yes yes
READ COMMITTED no yes yes
REPEATABLE READ no no yes
SERIALIZABLE no no no
Transazioni e gestione degli errori in SQL Server

Blocco dei record con SERIALIZABLE

  • Query con clausola WHERE basata su un intervallo di indice -> Blocca solo quei record
  • Query non basata su un intervallo di indice -> Blocca l'intera tabella
Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - query basata su un intervallo di indice

Transazione 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers
    WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------|-----|-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |

Record bloccato

Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - query basata su un intervallo di indice

Transazione 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers
    WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------|-----|-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |

Record bloccato

Transazione 2

...

...

INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);

Deve aspettare!

Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - query basata su un intervallo di indice

Transazione 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;

    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------|-----|-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |

Transazione 2

...

...

INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);

Deve aspettare!

Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - query basata su un intervallo di indice

Transazione 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;

    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;
COMMIT TRAN

Transazione 2

...

...

INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);

Eseguito alla fine!

Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - query basata su un intervallo di indice

Transazione 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN
    SELECT * FROM customers 
    WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------|-----|-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |

Transazione 2

...

...

INSERT INTO customers (customer_id, first_name, ...)
VALUES (200, 'Phantom', 'Ph', '[email protected]', 555666222);

Inserito subito!

Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - query non basata su un intervallo di indice

Transazione 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
    SELECT * FROM customers;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------| ... |-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |
...
| 10          | Carol      | York      | ... | 555148988 |

Blocca l'intera tabella

Transazione 2

...

...

INSERT INTO customers
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);

Deve aspettare!

Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - query non basata su un intervallo di indice

Transazione 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
    SELECT * FROM customers;

    SELECT * FROM customers;
| customer_id | first_name | last_name | ... | phone     |
|-------------|------------|-----------| ... |-----------|
| 1           | Dylan      | Smith     | ... | 555888999 |
...
| 10          | Carol      | York      | ... | 555148988 |

Transazione 2

...

...

INSERT INTO customers
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);

Deve aspettare!

Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - query non basata su un intervallo di indice

Transazione 1

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
    SELECT * FROM customers;

    SELECT * FROM customers;
COMMIT TRAN

Transazione 2

...

...

INSERT INTO customers 
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);

Eseguito alla fine!

Transazioni e gestione degli errori in SQL Server

SERIALIZABLE - riepilogo

Pro:

  • Buona consistenza dei dati: previene dirty, non-repeatable e phantom reads

Contro:

  • Puoi essere bloccato da una transazione SERIALIZABLE

Quando usarlo?:

  • Quando la consistenza è fondamentale
Transazioni e gestione degli errori in SQL Server

Passiamo alla pratica !

Transazioni e gestione degli errori in SQL Server

Preparing Video For Download...