Giao dịch (Transaction) là một tập hợp các câu lệnh SQL được thực hiện như một đơn vị công việc duy nhất. Nếu tất cả các câu lệnh trong giao dịch thành công, kết quả sẽ được cam kết (commit) vào cơ sở dữ liệu. Nếu bất kỳ câu lệnh nào thất bại, tất cả các thay đổi sẽ được hủy bỏ (rollback) để duy trì tính toàn vẹn của dữ liệu. Giao dịch đảm bảo tính nhất quán và an toàn dữ liệu trong môi trường cơ sở dữ liệu.
Các đặc điểm chính của giao dịch (ACID):
Một giao dịch phải tuân thủ bốn đặc tính được gọi là ACID:
- Atomicity (Tính nguyên tử): Giao dịch là một khối đơn vị, tức là hoặc tất cả các câu lệnh đều thực thi, hoặc không có gì được thực hiện. Nếu có bất kỳ lỗi nào xảy ra, toàn bộ giao dịch sẽ bị hủy bỏ.
- Consistency (Tính nhất quán): Giao dịch phải đư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. Nếu bất kỳ lỗi nào xảy ra trong quá trình giao dịch, tính nhất quán của cơ sở dữ liệu sẽ được khôi phục lại nhờ rollback.
- Isolation (Tính cô lập): Các giao dịch phải thực thi độc lập với nhau. Giao dịch đang diễn ra không được ảnh hưởng bởi các giao dịch khác đồng thời.
- Durability (Tính bền vững): Khi một giao dịch được cam kết (commit), các thay đổi sẽ được lưu vĩnh viễn, ngay cả khi có sự cố như mất điện hoặc lỗi hệ thống.
Các câu lệnh chính trong giao dịch MySQL:
- START TRANSACTION: Bắt đầu một giao dịch mới.
- COMMIT: Kết thúc giao dịch và cam kết các thay đổi vào cơ sở dữ liệu.
- ROLLBACK: Hủy bỏ giao dịch và phục hồi dữ liệu về trạng thái trước khi giao dịch bắt đầu.
- SAVEPOINT: Tạo một điểm lưu trong giao dịch, cho phép bạn quay lại điểm lưu cụ thể này nếu cần.
- ROLLBACK TO SAVEPOINT: Hủy bỏ các thay đổi kể từ một điểm lưu cụ thể.
- SET AUTOCOMMIT: Bật hoặc tắt chế độ tự động cam kết (tức là mỗi câu lệnh SQL được tự động cam kết nếu không có lệnh
START TRANSACTION
).
Ví dụ minh họa giao dịch:
START TRANSACTION;
-- Chèn dữ liệu vào bảng 1
INSERT INTO accounts (user_id, balance) VALUES (1, 1000);
-- Chèn dữ liệu vào bảng 2
INSERT INTO transactions (user_id, amount, type) VALUES (1, 1000, 'deposit');
-- Nếu cả hai câu lệnh đều thành công, commit giao dịch
COMMIT;
Nếu có lỗi xảy ra trong bất kỳ bước nào, bạn có thể sử dụng ROLLBACK
để hủy bỏ toàn bộ giao dịch:
START TRANSACTION;
-- Chèn dữ liệu vào bảng 1
INSERT INTO accounts (user_id, balance) VALUES (1, 1000);
-- Giả sử câu lệnh sau gặp lỗi
INSERT INTO transactions (user_id, amount, type) VALUES (1, 1000, 'withdraw');
-- Do lỗi xảy ra, rollback giao dịch
ROLLBACK;
Cách sử dụng SAVEPOINT:
START TRANSACTION;
-- Tạo savepoint
SAVEPOINT save1;
-- Chèn dữ liệu vào bảng 1
INSERT INTO accounts (user_id, balance) VALUES (1, 1000);
-- Quay lại điểm lưu
ROLLBACK TO save1;
-- Commit những thay đổi sau savepoint
COMMIT;
Lưu ý về InnoDB:
- Trong MySQL, chỉ có các bảng sử dụng InnoDB hỗ trợ giao dịch. Nếu bạn sử dụng các bảng với loại
MyISAM
, thì chúng không hỗ trợ các tính năng giao dịch.
Kết luận:
Giao dịch trong MySQL là một công cụ mạnh mẽ để quản lý các hoạt động thao tác dữ liệu một cách an toàn, đảm bảo rằng dữ liệu luôn trong trạng thái nhất quán. Việc sử dụng giao dịch giúp tránh các vấn đề về mất dữ liệu hoặc lỗi trong quá trình xử lý đồng thời.