

Giao Dịch (Transaction) Trong MySQL — START TRANSACTION, COMMIT, ROLLBACK
- 08-07-2025
- Toanngo92
- 0 Comments
Transaction (Giao dịch) trong MySQL — một phần cực kỳ quan trọng khi bạn muốn đảm bảo rằng một loạt thao tác SQL được thực hiện toàn vẹn hoặc không thực hiện gì cả. Đây là nền tảng của việc xử lý dữ liệu an toàn trong các ứng dụng ngân hàng, bán hàng, tài chính, v.v.
Mục lục
✅ 1. Transaction là gì?
- Transaction (Giao dịch) là tập hợp các câu lệnh SQL được thực thi như một đơn vị logic duy nhất.
- Một transaction chỉ có 2 kết quả:
- Thành công → lưu toàn bộ (
COMMIT
) - Thất bại → hủy toàn bộ (
ROLLBACK
)
- Thành công → lưu toàn bộ (
✅ 2. Thuộc tính ACID của transaction
Thuộc tính | Ý nghĩa |
---|---|
Atomicity | Tính nguyên tử: hoặc tất cả các bước đều thực hiện, hoặc không gì cả |
Consistency | Dữ liệu luôn ở trạng thái hợp lệ trước và sau giao dịch |
Isolation | Các giao dịch không ảnh hưởng lẫn nhau |
Durability | Khi đã COMMIT , dữ liệu được lưu vĩnh viễn |
✅ 3. Cú pháp cơ bản
START TRANSACTION;
-- câu lệnh SQL 1
-- câu lệnh SQL 2
-- ...
COMMIT; -- lưu lại tất cả thay đổi
-- hoặc
ROLLBACK; -- hủy tất cả thay đổi
Có thể dùng
BEGIN
thay choSTART TRANSACTION
.
✅ 4. Ví dụ thực tế
🧪 Bảng mẫu:
CREATE TABLE Accounts (
id INT PRIMARY KEY,
name VARCHAR(50),
balance INT
);
INSERT INTO Accounts VALUES (1, 'Nam', 1000), (2, 'Linh', 1000);
🎯 Chuyển tiền từ Nam → Linh 200k:
START TRANSACTION;
UPDATE Accounts SET balance = balance - 200 WHERE id = 1; -- trừ Nam
UPDATE Accounts SET balance = balance + 200 WHERE id = 2; -- cộng Linh
COMMIT;
Nếu một dòng bị lỗi (ví dụ: sai
id
), bạn có thể dùng:
ROLLBACK;
✅ 5. Tình huống thất bại cần rollback
START TRANSACTION;
UPDATE Accounts SET balance = balance - 200 WHERE id = 1;
UPDATE Accounts SET balance = balance + 200 WHERE id = 9999; -- ❌ lỗi: không có id này
ROLLBACK; -- hủy mọi thay đổi
✅ 6. Kiểm tra tự động commit
MySQL mặc định autocommit = 1
, nghĩa là mỗi câu lệnh được COMMIT
ngay sau khi thực hiện.
SELECT @@autocommit;
SET autocommit = 0; -- tắt autocommit để dùng transaction thủ công
✅ 7. Dùng transaction trong code (PHP / Laravel…)
PHP MySQLi:
$conn->begin_transaction();
try {
$conn->query("UPDATE ...");
$conn->query("UPDATE ...");
$conn->commit();
} catch (Exception $e) {
$conn->rollback();
}
Laravel (Eloquent):
DB::transaction(function () {
DB::table('accounts')->where('id', 1)->decrement('balance', 200);
DB::table('accounts')->where('id', 2)->increment('balance', 200);
});
✅ 8. Lưu ý khi sử dụng Transaction
Lưu ý | Giải thích |
---|---|
✅ Chỉ hoạt động với InnoDB | Không hoạt động trên bảng MyISAM |
✅ Chỉ COMMIT khi mọi bước thành công | Nếu có lỗi → nên ROLLBACK |
❌ Không rollback được ALTER , CREATE , DROP | Chỉ thao tác dữ liệu mới rollback được |
✅ Nên dùng trong xử lý đa bước | Rút tiền, chuyển khoản, đặt hàng… |
📘 Kết Luận
Transaction
giúp đảm bảo tính toàn vẹn dữ liệu trong các thao tác nhiều bước.- Hãy luôn dùng transaction khi xử lý dữ liệu quan trọng hoặc nhiều bảng liên quan.
- Kết hợp với procedure/trigger sẽ tăng độ an toàn của hệ thống.