Transactions


🔥 Tổng Quan Về Transaction Trong MySQL

✅ 1. Transaction là gì?

Transaction là một nhóm các thao tác SQL được thực hiện như một đơn vị logic duy nhất – hoặc thành công tất cả, hoặc thất bại tất cả.

Ví dụ:

START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;

🧱 2. ACID – 4 Thuộc Tính Cốt Lõi

Tính chất của giao dịch (ACID):**

  • Atomicity: Tính nguyên tử - giao dịch phải được thực hiện toàn bộ hoặc không có phần nào được thực hiện.

  • Consistency: Tính nhất quán - giao dịch phải chuyển hệ thống từ trạng thái nhất quán này sang trạng thái nhất quán khác.

  • Isolation: Tính cô lập - giao dịch này không ảnh hưởng đến giao dịch khác.

  • Durability: Tính bền vững - khi giao dịch đã được xác nhận, thay đổi sẽ được lưu trữ vĩnh viễn.


💡 3. Các Lệnh Quản Lý Transaction

Lệnh
Ý nghĩa

START TRANSACTION hoặc BEGIN

Bắt đầu một transaction mới

COMMIT

Xác nhận và lưu thay đổi

ROLLBACK

Huỷ toàn bộ các thao tác trong transaction

SAVEPOINT name

Tạo điểm lưu giữa transaction

ROLLBACK TO SAVEPOINT name

Rollback về điểm lưu


🛠️ 4. Storage Engine hỗ trợ Transaction

Engine
Transaction

InnoDB

✅ Có hỗ trợ

MyISAM

❌ Không hỗ trợ

👉 Hãy luôn dùng InnoDB nếu hệ thống của bạn cần xử lý transaction.


🔐 5. Isolation Levels (Cấp độ cô lập)

Ảnh hưởng trực tiếp đến performance & data consistency.

Isolation Level
Dirty Read
Non-repeatable Read
Phantom Read

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ (mặc định của InnoDB)

SERIALIZABLE

Ví dụ cấu hình:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

💥 6. Vấn Đề Kinh Điển (Classic Problems)

Vấn đề
Mô tả

Dirty Read

Đọc dữ liệu chưa commit

Non-repeatable Read

Cùng 1 query, đọc ra 2 kết quả khác nhau trong 1 transaction

Phantom Read

Thêm dữ liệu mới làm thay đổi kết quả truy vấn


⚙️ 7. Tích hợp với Java – JDBC/Spring

Trong Java, bạn sẽ thường dùng:

JDBC:

conn.setAutoCommit(false);
try {
    // các thao tác
    conn.commit();
} catch (Exception e) {
    conn.rollback();
}

Spring:

@Transactional
public void transferMoney() {
   // tự động commit/rollback
}

📌 8. Một số best practices cho Transaction:

  • Giữ transaction ngắn gọn, tránh lock lâu → gây deadlock

  • Luôn xử lý rollback exception cẩn thận

  • Không mix quá nhiều thao tác không liên quan vào cùng một transaction

  • Luôn xác định isolation level phù hợp với business


Last updated