Skip to content
youhoc
  • Pages
    • Home
    • Modern App Guidelines
    • Linux
      • Day 1: Linux Distributions & Navigation
      • Day 2: User Management
      • Day 3: File Permission & Ownership
      • Day 4: Package Management
      • Day 5: Services Management
    • Javascript
      • JS The Weird Part
        • Execution Context
        • Types & Operators
        • Objects & Functions
        • Error Handling & Strict Mode
        • Typescript, ES6, Tra
      • Modern JS
        • JS in the Browser
        • Data Storage JSON
        • Modern JS
        • Advanced Objects & Methods
        • Webpack & Babel
        • Async
      • jQuery
        • In-depth Analysis of jQuery
      • React-ready JS
        • Arrow Function
        • Template Literals
        • Logical AND, OR, Ternary, Nullish Operators
        • Destructuring & Rest Operator
        • Array Method
        • Immutability and Spread Operator
        • Promises, Async/Await, Callback
    • PHP
      • gruntJS
      • composer
      • MySQL
    • Docker
      • Container Basics
      • Container Networking
      • Container Image
      • Container Volume & Persistent Data
      • Dockerfile
      • Docker Compose
      • Docker Registry
    • Node.js
      • Installing & Exploring
      • Loading Modules
      • npm - Get Command Input
      • Web Server
        • Express Web Server
        • Template Engine & MVC
      • File System & Input Arguments
      • 6. Deploy to Heroku & Github
      • Authentication
      • 7. Databases
      • 8. Rest API
      • Errors
      • Sequelize
        • icon picker
          Sequelize Transactions: Đảm Bảo Tính Toàn Vẹn Dữ Liệu
        • 7 loại Data Types phổ biến Trong Sequelize
    • File Upload với Multer, Express.js
    • ReactJS
      • React from Andrew
        • Summary from Next
        • 1. Basics
        • 2. React Components
        • 3. Webpack
        • 4. Styling with SCSS
        • 5. React Router
        • 6. React Hook
      • Modern React From The Beginning
        • Intro to JSX
        • Vite Build Tools
        • Basic Component Creation
        • Component State
        • Props & Component Composition
        • useState with Inputs & Form Submission
        • useEffect, useRef & Local Storage
        • Async / Await and Http Request in React
        • React Router: Declarative Mode
        • ContextAPI
        • React Router: Framework Mode
          • File-routing & HTML Layouts
          • Server-side Data Query
          • Links & Navigation
          • Loaders
    • Typescript
      • Type User vs UserProp
    • Payload CMS
    • Authentication

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:
Atomicity (Tính nguyên tử): Tất cả hoặc không có gì - không có trạng thái “làm một nửa”
Consistency (Tính nhất quán): Database luôn ở trạng thái hợp lệ
Isolation (Tính cô lập): Các transaction không ảnh hưởng lẫn nhau
Durability (Tính bền vững): Dữ liệu đã commit không bị mất
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:
Xóa file/ảnh trên disk TRƯỚC
Xóa records trong database SAU
Commit transaction
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()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:
Code ngắn gọn hơn
Không lo quên commit() hoặc rollback()
Tự động xử lý exception
Nhược điểm:
Ít linh hoạt hơn với error handling phức tạp
Khó debug hơn

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:
Logic đơn giản, rõ ràng
Không cần xử lý error phức tạp
Muốn code ngắn gọn, dễ đọc
Tất cả operations đều là DB queries
✅ Dùng Manual Transaction khi:
Cần control chi tiết việc commit/rollback
Có logic phức tạp với nhiều điều kiện
Cần cleanup resources đặc biệt khi rollback
Kết hợp với file operations, external APIs

Error Handling với Managed Transaction

Tóm tắt

Managed Transaction giống như một "khối bảo vệ tự động":
Bạn chỉ cần viết logic bên trong callback
Sequelize tự lo commit nếu thành công
Sequelize tự lo rollback nếu có lỗi
Code ngắn gọn, ít lỗi hơn
Nhớ: Mọi query bên trong callback PHẢI{ transaction: t } để được bao gồm trong transaction!

Best Practices

1. Luôn dùng try-catch với manual transactions

2. Giữ transaction ngắn gọn

3. Xử lý file operations cẩn thận

Tóm tắt

Transaction đảm bảo nhiều DB operations thành công hoàn toàn hoặc thất bại hoàn toàn
Manual pattern: const t = await sequelize.transaction()commit() / rollback()
Managed pattern: sequelize.transaction(async (t) => { ... }) → auto-commit/rollback
Quan trọng: Xóa file trước → Xóa DB sau, luôn dùng try-catch
Best practice: Giữ transaction ngắn, chỉ DB operations, xử lý external calls bên ngoài
Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.