ระดับการแยกแบบ SERIALIZABLE

Transactions and Error Handling in SQL Server

Miriam Antona

Software Engineer

SERIALIZABLE

  • ระดับการแยกที่เข้มงวดที่สุด
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Transactions and Error Handling in SQL Server

เปรียบเทียบระดับการแยก

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
Transactions and Error Handling in SQL Server

การล็อกระเบียนด้วย SERIALIZABLE

  • คิวรีที่มีส่วนคำสั่ง WHERE อิงตามช่วงดัชนี -> ล็อกเฉพาะระเบียนนั้น
  • คิวรีที่ไม่ได้อิงตามช่วงดัชนี -> ล็อกทั้งตาราง
Transactions and Error Handling in SQL Server

SERIALIZABLE - คิวรีอิงตามช่วงดัชนี

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

ระเบียนที่ถูกล็อก

Transactions and Error Handling in SQL Server

SERIALIZABLE - คิวรีอิงตามช่วงดัชนี

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

ระเบียนที่ถูกล็อก

Transaction 2

...

...

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

ต้องรอก่อน!

Transactions and Error Handling in SQL Server

SERIALIZABLE - คิวรีอิงตามช่วงดัชนี

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

Transaction 2

...

...

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

ต้องรอก่อน!

Transactions and Error Handling in SQL Server

SERIALIZABLE - คิวรีอิงตามช่วงดัชนี

Transaction 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

Transaction 2

...

...

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

ดำเนินการได้ในที่สุด!

Transactions and Error Handling in SQL Server

SERIALIZABLE - คิวรีอิงตามช่วงดัชนี

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

Transaction 2

...

...

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

แทรกได้ทันที!

Transactions and Error Handling in SQL Server

SERIALIZABLE - คิวรีที่ไม่ได้อิงตามช่วงดัชนี

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

ล็อกทั้งตาราง

Transaction 2

...

...

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

ต้องรอก่อน!

Transactions and Error Handling in SQL Server

SERIALIZABLE - คิวรีที่ไม่ได้อิงตามช่วงดัชนี

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

Transaction 2

...

...

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

ต้องรอก่อน!

Transactions and Error Handling in SQL Server

SERIALIZABLE - คิวรีที่ไม่ได้อิงตามช่วงดัชนี

Transaction 1

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

    SELECT * FROM customers;
COMMIT TRAN

Transaction 2

...

...

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

ดำเนินการได้ในที่สุด!

Transactions and Error Handling in SQL Server

SERIALIZABLE - สรุป

ข้อดี:

  • ความสอดคล้องของข้อมูลดี: ป้องกัน dirty, non-repeatable และ phantom reads

ข้อเสีย:

  • อาจถูก transaction แบบ SERIALIZABLE บล็อกการทำงาน

ควรใช้เมื่อใด?:

  • เมื่อต้องการความสอดคล้องของข้อมูลอย่างเคร่งครัด
Transactions and Error Handling in SQL Server

มาฝึกกันเถอะ!

Transactions and Error Handling in SQL Server

Preparing Video For Download...