Isolation Levels


🔒 Isolation Levels trong MySQL (theo chuẩn SQL)

MySQL (với InnoDB) hỗ trợ 4 cấp độ isolation sau:

Isolation Level
Dirty Read
Non-Repeatable Read
Phantom Read

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ (default)

SERIALIZABLE


🧪 1. READ UNCOMMITTED

  • Thấy cả thay đổi chưa commit từ transaction khác.

  • Cực kỳ nguy hiểm → Dễ gặp dirty read.

Dùng khi chỉ đọc dữ liệu không quan trọng, không cần chính xác tuyệt đối.


🔍 2. READ COMMITTED (Giống Oracle, SQL Server)

  • Chỉ thấy dữ liệu đã commit.

  • Nhưng cùng một query, lần 1 và lần 2 có thể trả về khác nhau → gây non-repeatable read.

An toàn hơn, dùng được trong đa số hệ thống nếu đã xử lý consistency bằng ứng dụng.


♻️ 3. REPEATABLE READ (Mặc định trong InnoDB/MySQL)

  • Cùng một query trong 1 transaction sẽ luôn thấy dữ liệu như lúc bắt đầu.

  • Tránh được dirty + non-repeatable read.

  • Nhưng vẫn bị phantom read (ví dụ: thêm mới row nhưng vẫn match điều kiện WHERE sau đó).

⚙️ MySQL dùng MVCC (Multi-Version Concurrency Control) để đảm bảo điều này.

Phù hợp cho đa số hệ thống, mức cân bằng tốt giữa hiệu năng và độ an toàn.


🧱 4. SERIALIZABLE

  • Gần như chạy từng transaction một.

  • Dùng locking trên toàn bộ rows/table.

  • Không bị bất kỳ vấn đề nào về isolation.

❌ Hiệu năng rất thấp nếu concurrency cao. ✅ Dùng trong những nghiệp vụ cực kỳ quan trọng (kiểm toán, tính toán lương cuối tháng,...).


🔄 Cách Cấu Hình Isolation Level trong MySQL

🔧 Kiểm tra mặc định:

SELECT @@transaction_isolation;
-- hoặc
SELECT @@global.transaction_isolation;

✏️ Thay đổi tạm thời (cho session hiện tại):

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

⚙️ Thay đổi mặc định (cho toàn bộ instance):

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

🔗 Áp dụng trong Java (Spring + JDBC)

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void transferMoney(...) {
    // logic chuyển tiền
}

Các giá trị Isolation trong Spring tương ứng với MySQL:

Spring Constant
MySQL Level

Isolation.READ_UNCOMMITTED

READ UNCOMMITTED

Isolation.READ_COMMITTED

READ COMMITTED

Isolation.REPEATABLE_READ

REPEATABLE READ

Isolation.SERIALIZABLE

SERIALIZABLE


🧠 Khi nào dùng isolation nào?

Use-case
Khuyến nghị Isolation

Hệ thống báo cáo, dashboard

READ COMMITTED hoặc thấp hơn

Quản lý kho, ví điện tử

REPEATABLE READ

Banking, kế toán, nghiệp vụ nhạy cảm

SERIALIZABLE

Last updated