Sequelize Transactions: Đảm Bảo Tính Toàn Vẹn Dữ Liệu
Transaction (giao dịch) trong database là một nhóm các thao tác SQL được thực thi như một đơn vị duy nhất. Tất cả các thao tác trong transaction phải thành công hoàn toàn hoặc thất bại hoàn toàn - không có trạng thái trung gian.
Sequelize cung cấp sequelize.transaction() để bắt đầu một transaction và trả về một Transaction object (thường đặt tên là t).
Tại sao cần dùng Transaction?
Transaction đảm bảo các đặc tính ACID:
Ví dụ thực tế:
Cách sử dụng Manual Transaction
1. Pattern cơ bản
2. Ví dụ thực tế: Xóa Post và các ảnh liên quan
❌ Sai: Xóa không đồng bộ - Có thể gây lỗi
✅ Đúng: Dùng transaction và thứ tự hợp lý
Thứ tự quan trọng:
Lý do: Nếu xóa DB trước mà xóa file sau bị lỗi, bạn mất thông tin về file cần xóa. Ngược lại nếu xóa file trước mà DB sau bị lỗi, transaction rollback và bạn vẫn có thông tin để thử lại.
Managed Transaction (Auto-commit/rollback)
Thay vì quản lý commit() và rollback() thủ công, bạn có thể dùng callback pattern:
Sequelize thực chất làm như này (pseudo-code):
Ưu điểm:
Nhược điểm:
Ví dụ 1: Tạo Order với nhiều OrderItems
Ví dụ 2: Transfer tiền giữa 2 tài khoản
Ví dụ 3: Xóa User và tất cả dữ liệu liên quan
Ví dụ 4: Nested operations phức tạp
Khi nào dùng Managed vs Manual?
✅ Dùng Managed Transaction khi:
✅ Dùng Manual Transaction khi:
Error Handling với Managed Transaction
Tóm tắt
Managed Transaction giống như một "khối bảo vệ tự động":
Nhớ: Mọi query bên trong callback PHẢI có { transaction: t } để được bao gồm trong transaction!
