Lệnh SET TRANSACTION ISOLATION LEVEL
trong MySQL (và các hệ quản trị cơ sở dữ liệu khác) được sử dụng để đặt mức độ cô lập giao dịch, kiểm soát cách các giao dịch có thể nhìn thấy thay đổi từ các giao dịch khác và tránh các vấn đề như đọc không lặp lại (non-repeatable read), dirty read, và phantom read.
Mức độ cô lập xác định mức độ mà một giao dịch bị ảnh hưởng bởi các giao dịch khác khi nhiều giao dịch đang thực thi đồng thời.
Cú pháp:
SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};
Các mức độ cô lập:
READ UNCOMMITTED:
- Cho phép giao dịch đọc các thay đổi chưa được commit từ các giao dịch khác. Điều này có thể dẫn đến dirty read, tức là đọc dữ liệu chưa được xác nhận có thể bị thay đổi hoặc hủy bỏ sau đó.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
READ COMMITTED (Mức mặc định trong nhiều hệ thống):
- Chỉ cho phép đọc dữ liệu đã được commit từ các giao dịch khác. Tránh được dirty read nhưng có thể xảy ra non-repeatable read (dữ liệu có thể thay đổi giữa các lần đọc trong cùng một giao dịch).
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
REPEATABLE READ (Mức mặc định trong MySQL):
- Đảm bảo rằng nếu một hàng đã được đọc trong một giao dịch, thì dữ liệu của hàng đó sẽ không thay đổi trong suốt giao dịch đó (không có non-repeatable read). Tuy nhiên, có thể gặp phải phantom read, tức là các hàng mới có thể được chèn vào giữa các lần đọc.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SERIALIZABLE:
- Đây là mức độ cô lập cao nhất, nơi mọi giao dịch phải chạy tuần tự. Tránh hoàn toàn các vấn đề về dirty read, non-repeatable read, và phantom read, nhưng có thể ảnh hưởng đến hiệu năng vì giảm tính song song.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Ví dụ sử dụng:
Giả sử bạn đang làm việc với một hệ thống giao dịch ngân hàng và muốn tránh mọi khả năng lỗi xảy ra trong giao dịch, bạn có thể thiết lập mức cô lập cao nhất:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
-- Các câu lệnh giao dịch
COMMIT;
Trong trường hợp bạn chỉ muốn đảm bảo không đọc phải dữ liệu chưa được commit, bạn có thể đặt mức cô lập thấp hơn như READ COMMITTED
để cải thiện hiệu năng:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- Các câu lệnh giao dịch
COMMIT;
Tổng kết:
Lệnh SET TRANSACTION ISOLATION LEVEL
cho phép bạn điều chỉnh hành vi của giao dịch để đảm bảo tính toàn vẹn dữ liệu trong các trường hợp giao dịch đồng thời. Mỗi mức độ cô lập sẽ cân bằng giữa tính an toàn của dữ liệu và hiệu suất hệ thống.