Mức cô lập SERIALIZABLE

Giao dịch và Xử lý lỗi trong SQL Server

Miriam Antona

Software Engineer

SERIALIZABLE

  • Mức cô lập nghiêm ngặt nhất
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Giao dịch và Xử lý lỗi trong SQL Server

So sánh mức cô lập

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
Giao dịch và Xử lý lỗi trong SQL Server

Khóa bản ghi với SERIALIZABLE

  • Truy vấn WHERE theo phạm vi chỉ mục -> Chỉ khóa các bản ghi đó
  • Truy vấn không theo phạm vi chỉ mục -> Khóa toàn bộ bảng
Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - truy vấn theo phạm vi chỉ mục

Giao dịch 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 |

Bản ghi đã khóa

Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - truy vấn theo phạm vi chỉ mục

Giao dịch 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 |

Bản ghi đã khóa

Giao dịch 2

...

...

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

Phải chờ!

Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - truy vấn theo phạm vi chỉ mục

Giao dịch 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 |

Giao dịch 2

...

...

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

Phải chờ!

Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - truy vấn theo phạm vi chỉ mục

Giao dịch 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

Giao dịch 2

...

...

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

Đã thực thi!

Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - truy vấn theo phạm vi chỉ mục

Giao dịch 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 |

Giao dịch 2

...

...

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

Chèn ngay!

Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - truy vấn không theo phạm vi chỉ mục

Giao dịch 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 |

Khóa toàn bộ bảng

Giao dịch 2

...

...

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

Phải chờ!

Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - truy vấn không theo phạm vi chỉ mục

Giao dịch 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 |

Giao dịch 2

...

...

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

Phải chờ!

Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - truy vấn không theo phạm vi chỉ mục

Giao dịch 1

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

    SELECT * FROM customers;
COMMIT TRAN

Giao dịch 2

...

...

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

Đã thực thi!

Giao dịch và Xử lý lỗi trong SQL Server

SERIALIZABLE - tóm tắt

Ưu điểm:

  • Tính nhất quán cao: Ngăn bẩn, không lặp lại và phantom reads

Nhược điểm:

  • Có thể bị chặn bởi giao dịch SERIALIZABLE

Khi nào dùng?:

  • Khi cần tuyệt đối nhất quán
Giao dịch và Xử lý lỗi trong SQL Server

Ayo berlatih!

Giao dịch và Xử lý lỗi trong SQL Server

Preparing Video For Download...