Mức cô lập giao dịch

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

Miriam Antona

Software Engineer

Đồng thời là gì?

Đồng thời (concurrency): hai hay nhiều giao dịch cùng đọc/thay đổi dữ liệu dùng chung tại cùng thời điểm.

Cô lập giao dịch của ta khỏi giao dịch khác

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

Mức cô lập giao dịch

  • READ COMMITTED (mặc định)
  • READ UNCOMMITTED
  • REPEATABLE READ
  • SERIALIZABLE
  • SNAPSHOT
SET TRANSACTION ISOLATION LEVEL 
    {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE | SNAPSHOT}
Giao dịch và Xử lý lỗi trong SQL Server

Xác định mức cô lập hiện tại

SELECT CASE transaction_isolation_level 
    WHEN 0 THEN 'UNSPECIFIED' 
    WHEN 1 THEN 'READ UNCOMMITTED' 
    WHEN 2 THEN 'READ COMMITTED' 
    WHEN 3 THEN 'REPEATABLE READ ' 
    WHEN 4 THEN 'SERIALIZABLE' 
    WHEN 5 THEN 'SNAPSHOT' 
END AS transaction_isolation_level 
FROM sys.dm_exec_sessions 
WHERE session_id = @@SPID
| transaction_isolation_level |
|-----------------------------|
| READ COMMITTED              |
Giao dịch và Xử lý lỗi trong SQL Server

READ UNCOMMITTED

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • Mức cô lập ít hạn chế nhất
  • Có thể đọc các hàng do giao dịch khác sửa đổi chưa commit hoặc rollback
Giao dịch và Xử lý lỗi trong SQL Server

READ UNCOMMITTED

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • Mức cô lập ít hạn chế nhất
  • Có thể đọc các hàng do giao dịch khác sửa đổi chưa được commit/rollback.
Đọc bẩn Đọc không lặp lại Đọc ma
READ UNCOMMITTED
Giao dịch và Xử lý lỗi trong SQL Server

Đọc bẩn (Dirty reads)

Số dư ban đầu tài khoản 5 = $35.000

Giao dịch 1

BEGIN TRAN
  UPDATE accounts
  SET current_balance = 30000
  WHERE account_id = 5;

ROLLBACK TRAN;

Giao dịch 2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |
Giao dịch và Xử lý lỗi trong SQL Server

Đọc không lặp lại (Non-repeatable reads)

Giao dịch 1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
    SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |

Giao dịch 2

...

...

BEGIN TRAN
    UPDATE accounts
    SET current_balance = 30000 WHERE account_id = 5;
COMMIT TRAN
Giao dịch và Xử lý lỗi trong SQL Server

Đọc không lặp lại (Non-repeatable reads)

Giao dịch 1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
    SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |
    SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |

Giao dịch 2

...

...

BEGIN TRAN
    UPDATE accounts
    SET current_balance = 30000 WHERE account_id = 5;
COMMIT TRAN
Giao dịch và Xử lý lỗi trong SQL Server

Đọc ma (Phantom reads)

Giao dịch 1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
SELECT * FROM accounts
    WHERE current_balance BETWEEN 45000 AND 50000
| account_number       | ... | current_balance |
|----------------------|-----|-----------------|
| 55555555552020202020 | ... | 50000,00        |

Giao dịch 2

...

...

BEGIN TRAN
INSERT INTO accounts
    VALUES ('55555555553939393939', 1, 45000)
COMMIT TRAN
Giao dịch và Xử lý lỗi trong SQL Server

Đọc ma (Phantom reads)

Giao dịch 1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
SELECT * FROM accounts 
    WHERE current_balance BETWEEN 45000 AND 50000
| account_number       | ... | current_balance |
|----------------------|-----|-----------------|
| 55555555552020202020 | ... | 50000,00        | 
SELECT * FROM accounts 
    WHERE current_balance BETWEEN 45000 AND 50000
| account_number       |...| current_balance |
|----------------------|---|-----------------|
| 55555555553939393939 |...| 45000,00        | Ma!
| 55555555552020202020 |...| 50000,00        |

Giao dịch 2

...

...

BEGIN TRAN
INSERT INTO accounts
    VALUES ('55555555553939393939', 1, 45000)
COMMIT TRAN
Giao dịch và Xử lý lỗi trong SQL Server

READ UNCOMMITTED - tóm tắt

Ưu điểm:

  • Nhanh hơn, không chặn giao dịch khác.

Nhược điểm:

  • Cho phép đọc bẩn, đọc không lặp lại, và đọc ma.

Khi nào dùng?:

  • Không muốn bị chặn bởi giao dịch khác và chấp nhận hiện tượng đồng thời.
  • Muốn xem dữ liệu chưa commit.
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...