Skip to content

ACID là gì

ACID là một nguyên tắc quan trọng trong cơ sở dữ liệu (database), đặc biệt là cho giao dịch (transaction) – tức là một loạt thao tác phải được thực hiện toàn vẹn.

1. Transaction:

Là một nhóm thao tác (SQL statements) được thực hiện như một đơn vị xử lý duy nhất. Tất cả thao tác trong transaction phải cùng thành công hoặc cùng thất bại.

Ví dụ:

Chuyển $100 từ Account A tới Account B.

Transaction này bao gồm các hoạt động của cơ sở dữ liệu như sau:

  1. Tạo một record để chuyển 100 từ tài khoản A tới tài khoản B. Đây thường được coi là BEGIN của transaction.
  2. Đọc số dư của tài khoản A.
  3. Nếu số dư của tài khoản A ≥ 100, trừ tài khoản A đi 100.
  4. Đọc số dư của tài khoản B.
  5. Cộng 100 vào số dư của tài khoản B.
  6. Nếu mọi thứ thành công, transaction sẽ được COMMIT để đánh dấu sự thay đổi trong cơ sở dữ liệu là vĩnh viễn. Nếu có lỗi xảy ra thì transaction sẽ được ROLLBACK, tức mọi thay đổi sẽ trở về trạng thái ban đầu.

2. ACID:

ACID là viết tắt của 4 từ:

2.1. A – Atomicity (Tính nguyên tử):

Toàn bộ transaction phải diễn ra hoàn toàn hoặc không gì cả.

Ví dụ: Nếu chỉ trừ tiền A mà chưa cộng cho B, hệ thống sẽ hủy cả giao dịch để tránh mất mát.

2.2. C – Consistency (Tính nhất quán):

Transaction phải đảm bảo dữ liệu luôn ở trạng thái hợp lệ, đúng quy tắc.

Ví dụ: Tổng tiền của A + B không được thay đổi sau giao dịch, chỉ là tiền di chuyển, không tạo thêm hoặc mất đi.

2.3. I – Isolation (Tính độc lập):

Các transaction chạy đồng thời không gây ảnh hưởng sai lệch đến nhau.

Ví dụ: A và B chuyển tiền cùng lúc, nhưng hệ thống xử lý đúng từng người mà không bị lẫn dữ liệu.

Trong Isolation có 2 khái niệm quan trọng:

  • Read phenomena (Hiện tượng đọc)
  • Isolation levels (Cấp độ cô lập)

2.3.1. Read phenomena:

Read phenomena là các hiện tượng xảy ra khi nhiều transaction đọc và ghi dữ liệu cùng lúc, dẫn đến kết quả đọc không ổn định hoặc sai lệch.

Có 3 loại chính trong Read phenomena:

  • Dirty Read: đọc những dữ liệu chưa được commit.
  • Non-repeatable Read: đọc những thay đỗi đã được commit.
  • Phantom Read: đọc khi thêm record mới vào bảng.

2.3.2. Isolation levels:

Isolation level (Mức độ cô lập) là mức bảo vệ dữ liệu khi nhiều transaction chạy song song, quy định được phép xảy ra những read phenomena nào.

  • Read Uncommitted: Transaction có thể đọc những thay đổi chưa được commit hoặc đã được commit bởi những transaction khác. Đây là cấp độ cô lập thấp nhất và có tính concurency cao nhất. → Nhanh, nhưng dễ sai dữ liệu.
  • Read Committed: Mỗi query trong 1 transaction chỉ nhìn thấy các thay đổi đã được commit trước khi query bắt đầu. Mặc định của nhiều hệ quản trị CSDL, không cho Dirty Read, nhưng vẫn có Non-repeatable Read → Dữ liệu đã commit mới được đọc.
  • Repeatable Read: Mỗi query trong 1 transaction chỉ nhìn thấy các thay đổi đã được commit trước khi transaction đó bắt đầu. Không có Dirty Read và Non-repeatable Read, nhưng vẫn có thể xảy ra Phantom Read → Dữ liệu ổn định hơn, nhưng vẫn có “dữ liệu mới xuất hiện”.
  • Serializable: Các transaction được thực hiện thực hiện tuần tự. Đây là cấp độ cô lập cao nhất và có tính concurrency thấp nhất. Không xảy ra bất kỳ read phenomena nào
    → Chậm nhất, nhưng dữ liệu an toàn nhất.
Các cấp độ cô lập

Mối tương quan giữa hiện tượng đọc (read phenomenas) ở các cấp độ cô lập (isolation levels) mô tả như sau:

  • Mức cô lập càng cao thì các lỗi đọc (read phenomena) càng ít xảy ra hơn.
  • Ở mức độ cô lập cao nhất – Serializable, chúng ta không thấy xuất hiện một lỗi đọc nào. Ngược lại, ở mức độ cô lập thấp nhất – Read uncommitted, ta thấy xuất hiện tất cả các lỗi đọc.
Mối tương quan giữa cấp độ cô lập và các lỗi đọc

2.4. D – Durability (Tính bền vững):

Khi transaction hoàn tất, dữ liệu sẽ được lưu vĩnh viễn, kể cả khi mất điện hoặc hệ thống sập.

Ví dụ: Bạn chuyển tiền xong, hệ thống sập điện. Sau khi mở lại, lịch sử vẫn ghi lại giao dịch.

3. Tóm tắt:

Transaction là một tập hợp các câu query.

ACID là thuộc tính của transaction, bao gồm 4 tính chất:

  1. Tính nguyên tử (A – Atomicity)
  2. Tính nhất quán (C – Consistency)
  3. Tính cô lập (I – Isolation)
  4. Tính bền vững (D – Durability)

Có 3 hiện tượng đọc (Read phenomenon) phổ biến gây lỗi trong cơ sở dữ liệu là:

  1. Dirty reads: đọc thay đổi chưa được commit
  2. Repeatable reads: đọc thay đổi đã được commit
  3. Phantom reads: đọc thay đổi khi đang có record mới thêm vào cơ sở dữ liệu

Để khắc phục hiện tượng đọc (Read phenomenon) gây ra lỗi, có 4 mức độ cô lập (Isolation levels) khác nhau liệt kê theo thứ tự từ mức cô lập thấp(hiệu suất cao) tới mức cô lập cao(hiệu suất thấp). Mức cô lập càng cao thì hiệu suất của cơ sở dữ liệu càng giảm và ngược lại.

  1. Read uncommitted: Transaction có thể đọc những thay đổi chưa được commit hoặc đã được commit bởi những transaction khác. Đây là cấp độ cô lập thấp nhất.
  2. Read committed: Mỗi query trong 1 transaction chỉ nhìn thấy các thay đổi đã commit trước khi query bắt đầu.
  3. Repeatable read: Mỗi query trong 1 transaction chỉ nhìn thấy các thay đổi đã commit trước thời điểm BEGIN của transaction.
  4. Serializable: Các transaction thực hiện tuần tự. Đây là cấp độ cô lập cao nhất.

https://200lab.io/blog/acid-la-gi

https://viblo.asia/p/014-postgresql-transaction-isolation-OeVKB67JKkW

Published inAll

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *