Isoleringsnivån SERIALIZABLE

Transaktioner och felhantering i SQL Server

Miriam Antona

Software Engineer

SERIALIZABLE

  • Mest restriktiva isoleringsnivån
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Transaktioner och felhantering i SQL Server

Jämförelse av isoleringsnivåer

Smutsiga läsningar Icke-repeterbara läsningar Fantomläsningar
READ UNCOMMITTED ja ja ja
READ COMMITTED nej ja ja
REPEATABLE READ nej nej ja
SERIALIZABLE nej nej nej
Transaktioner och felhantering i SQL Server

Låsning av poster med SERIALIZABLE

  • Fråga med WHERE-sats baserad på ett indexintervall -> Låser bara de posterna
  • Fråga inte baserad på ett indexintervall -> Låser hela tabellen
Transaktioner och felhantering i SQL Server

SERIALIZABLE – fråga baserad på ett indexintervall

Transaktion 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 |

Låst post

Transaktioner och felhantering i SQL Server

SERIALIZABLE – fråga baserad på ett indexintervall

Transaktion 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 |

Låst post

Transaktion 2

...

...

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

Måste vänta!

Transaktioner och felhantering i SQL Server

SERIALIZABLE – fråga baserad på ett indexintervall

Transaktion 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 |

Transaktion 2

...

...

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

Måste vänta!

Transaktioner och felhantering i SQL Server

SERIALIZABLE – fråga baserad på ett indexintervall

Transaktion 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

Transaktion 2

...

...

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

Äntligen utförd!

Transaktioner och felhantering i SQL Server

SERIALIZABLE – fråga baserad på ett indexintervall

Transaktion 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 |

Transaktion 2

...

...

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

Infogad direkt!

Transaktioner och felhantering i SQL Server

SERIALIZABLE – fråga inte baserad på ett indexintervall

Transaktion 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 |

Låser hela tabellen

Transaktion 2

...

...

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

Måste vänta!

Transaktioner och felhantering i SQL Server

SERIALIZABLE – fråga inte baserad på ett indexintervall

Transaktion 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 |

Transaktion 2

...

...

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

Måste vänta!

Transaktioner och felhantering i SQL Server

SERIALIZABLE – fråga inte baserad på ett indexintervall

Transaktion 1

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

    SELECT * FROM customers;
COMMIT TRAN

Transaktion 2

...

...

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

Äntligen utförd!

Transaktioner och felhantering i SQL Server

SERIALIZABLE – sammanfattning

Fördelar:

  • God datakonsistens: förhindrar smutsiga, icke-repeterbara och fantomläsningar

Nackdelar:

  • Du kan blockeras av en SERIALIZABLE-transaktion

När bör du använda det?:

  • När datakonsistens är ett krav
Transaktioner och felhantering i SQL Server

Nu kör vi en övning!

Transaktioner och felhantering i SQL Server

Preparing Video For Download...