SERIALIZABLE 隔离级别

SQL Server 中的事务与错误处理

Miriam Antona

Software Engineer

SERIALIZABLE

  • 最严格的隔离级别
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SQL Server 中的事务与错误处理

隔离级别对比

脏读 不可重复读 幻读
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
SQL Server 中的事务与错误处理

SERIALIZABLE 的锁定行为

  • 带基于索引范围的 WHERE 查询 -> 只锁定这些记录
  • 非基于索引范围的查询 -> 锁定整张表
SQL Server 中的事务与错误处理

SERIALIZABLE——基于索引范围的查询

事务 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 |

已锁定记录

SQL Server 中的事务与错误处理

SERIALIZABLE——基于索引范围的查询

事务 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 |

已锁定记录

事务 2

...

...

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

需要等待!

SQL Server 中的事务与错误处理

SERIALIZABLE——基于索引范围的查询

事务 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 |

事务 2

...

...

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

需要等待!

SQL Server 中的事务与错误处理

SERIALIZABLE——基于索引范围的查询

事务 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

事务 2

...

...

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

终于执行!

SQL Server 中的事务与错误处理

SERIALIZABLE——基于索引范围的查询

事务 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 |

事务 2

...

...

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

已立即插入!

SQL Server 中的事务与错误处理

SERIALIZABLE——非基于索引范围的查询

事务 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 |

锁定整张表

事务 2

...

...

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

需要等待!

SQL Server 中的事务与错误处理

SERIALIZABLE——非基于索引范围的查询

事务 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 |

事务 2

...

...

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

需要等待!

SQL Server 中的事务与错误处理

SERIALIZABLE——非基于索引范围的查询

事务 1

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

    SELECT * FROM customers;
COMMIT TRAN

事务 2

...

...

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

终于执行!

SQL Server 中的事务与错误处理

SERIALIZABLE——总结

优点:

  • 数据一致性好:防止脏读、不可重复读、幻读

缺点:

  • 可能被 SERIALIZABLE 事务阻塞

何时使用?

  • 当必须保证数据一致性时
SQL Server 中的事务与错误处理

Vamos praticar!

SQL Server 中的事务与错误处理

Preparing Video For Download...