Giao dịch (transaction) là một đơn vị xử lý logic bao gồm một hoặc nhiều thao tác truy vấn cơ sở dữ liệu, nhằm đảm bảo tính toàn vẹn khi thực hiện các nghiệp vụ phức tạp. Ví dụ: Khi sa thải một nhân viên, hệ thống cần đồng thời xóa thông tin cá nhân, lịch sử lương, đánh giá hiệu suất và cập nhật trạng thái phòng ban — tất cả phải thành công hoặc thất bại cùng lúc.
Các đặc tính ACID của giao dịch
- Tính nguyên tử (Atomicity): Toàn bộ giao dịch được coi là một khối duy nhất — không thể chỉ thực hiện một phần. Nếu bất kỳ câu lệnh nào thất bại, toàn bộ sẽ được hoàn tác.
- Tính bền vững (Durability): Sau khi xác nhận (
COMMIT), mọi thay đổi được ghi vĩnh viễn vào đĩa, kể cả khi máy chủ gặp sự cố đột ngột. - Tính cô lập (Isolation): Các giao dịch chạy song song không ảnh hưởng lẫn nhau nhờ cơ chế kiểm soát mức độ cô lập.
- Tính nhất quán (Consistency): Giao dịch luôn đưa cơ sở dữ liệu từ trạng thái hợp lệ này sang trạng thái hợp lệ khác, tuân thủ ràng buộc toàn vẹn như khóa ngoại, kiểm tra điều kiện.
Yêu cầu nền tảng
Chỉ các bảng sử dụng storage engine InnoDB mới hỗ trợ giao dịch đầy đủ. Kiểm tra bằng lệnh:
SHOW ENGINES\G
Kết quả hiển thị Support = YES cho dòng InnoDB chứng tỏ hệ thống đã kích hoạt.
Cách thức xác nhận giao dịch
Chế độ thủ công
Bắt đầu giao dịch bằng:
START TRANSACTION;
Thực hiện các truy vấn (INSERT/UPDATE/DELETE), sau đó xác nhận hoặc hủy bỏ:
COMMIT; -- lưu vĩnh viễn
ROLLBACK; -- khôi phục trạng thái trước giao dịch
Các thay đổi trong khoảng thời gian giữa START TRANSACTION và COMMIT chỉ khả dụng trong phiên hiện tại — không nhìn thấy bởi các kết nối khác.
Chế độ tự động
Mặc định biến hệ thống autocommit được bật:
SELECT @@autocommit;
Khi autocommit = 1, mỗi câu lệnh DML độc lập được coi là một giao dịch riêng lẻ và tự động xác nhận. Để tắt chế độ này:
SET autocommit = 0;
Sau đó bắt buộc phải gọi COMMIT hoặc ROLLBACK rõ ràng để kết thúc.
Điểm khôi phục (Savepoint)
Cho phép tạo điểm đánh dấu bên trong giao dịch để hoàn tác từng phần:
-- Đặt điểm khôi phục
SAVEPOINT sp_2024_q3;
-- Quay lại điểm đã đặt
ROLLBACK TO sp_2024_q3;
-- Hoàn tác toàn bộ giao dịch
ROLLBACK;
Lưu ý: Nếu kết nối bị đóng đột ngột trước khi COMMIT, hệ thống tự động thực hiện ROLLBACK. Một khi đã xác nhận, dữ liệu không thể khôi phục.
Các mức độ cô lập giao dịch
InnoDB hỗ trợ bốn mức cô lập, ảnh hưởng đến cách đọc dữ liệu trong môi trường đa luồng:
- READ UNCOMMITTED: Cho phép đọc dữ liệu chưa cam kết → rủi ro dirty read.
- READ COMMITTED: Chỉ đọc dữ liệu đã
COMMIT, nhưng có thể gặp non-repeatable read nếu dữ liệu thay đổi giữa hai lần truy vấn trong cùng giao dịch. - REPEATABLE READ (mặc định): Đảm bảo kết quả truy vấn không thay đổi trong suốt giao dịch, dù dữ liệu gốc có bị sửa bởi giao dịch khác — giải pháp dựa trên cơ chế multi-version concurrency control (MVCC).
- SERIALIZABLE: Mức cao nhất, khóa toàn bộ tập dữ liệu liên quan — đảm bảo an toàn tuyệt đối nhưng gây nghẽn hiệu năng nghiêm trọng.
Thao tác với mức cô lập
-- Xem mức cô lập hiện tại (toàn cục / phiên)
SELECT @@global.transaction_isolation;
SELECT @@session.transaction_isolation;
-- Thiết lập mức cô lập cho phiên hiện tại
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Thiết lập toàn cục (cần quyền SUPER)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;