Hiểu về ACID trong Database: Nền tảng của tính toàn vẹn dữ liệu
Hiểu về ACID trong Database
ACID là một tập hợp các tính chất quan trọng trong cơ sở dữ liệu, đảm bảo tính toàn vẹn và độ tin cậy của dữ liệu trong các giao dịch (transactions). Thuật ngữ ACID là viết tắt của bốn tính chất cơ bản:
- Atomicity - /ˌætəˈmɪsəti/ (Tính nguyên tử)
- Consistency - /kənˈsɪstənsi/ (Tính nhất quán)
- Isolation - /ˌaɪsəˈleɪʃn/ (Tính cô lập)
- Durability - /ˌdʊrəˈbɪləti/ (Tính bền vững)
1. Atomicity (Tính nguyên tử)
Tính nguyên tử đảm bảo rằng một giao dịch được xử lý như một đơn vị không thể tách rời. Nếu một phần của giao dịch thất bại, toàn bộ giao dịch sẽ bị hủy bỏ (rollback) và cơ sở dữ liệu trở về trạng thái trước khi giao dịch bắt đầu.
- Định nghĩa: Một giao dịch là một đơn vị không thể chia nhỏ. Nó hoặc được thực hiện hoàn toàn, hoặc không thực hiện gì cả.
- Ý nghĩa: Nếu trong quá trình thực hiện giao dịch có lỗi xảy ra, tất cả các thay đổi được thực hiện trước đó sẽ bị hoàn tác (rollback).
- Ví dụ: Chuyển tiền từ tài khoản A sang B:
- Trừ tiền tài khoản A
- Cộng tiền tài khoản B
→ Nếu một trong hai bước thất bại, toàn bộ giao dịch sẽ bị hủy.
Ví dụ về Atomicity:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
Trong ví dụ này, nếu một trong hai lệnh UPDATE thất bại, toàn bộ giao dịch sẽ bị hủy bỏ, đảm bảo số dư tài khoản không bị mất hoặc không được cập nhật một phần.
Ví dụ chi tiết về giao dịch thất bại:
-- Giả sử chúng ta có bảng accounts với dữ liệu ban đầu:
-- account_id | balance
-- 1 | 1000
-- 2 | 500
BEGIN TRANSACTION;
-- Bước 1: Trừ tiền từ tài khoản 1
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Sau bước này, tài khoản 1 còn 900
-- Bước 2: Cộng tiền vào tài khoản 2
-- Giả sử có lỗi xảy ra ở đây (ví dụ: tài khoản 2 không tồn tại)
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Lệnh này thất bại vì tài khoản 2 không tồn tại
-- Do có lỗi, giao dịch sẽ tự động rollback
-- Tài khoản 1 sẽ trở về số dư ban đầu là 1000
ROLLBACK; -- Lệnh này được thực hiện tự động khi có lỗi
-- Kiểm tra số dư sau khi rollback
SELECT * FROM accounts;
-- Kết quả:
-- account_id | balance
-- 1 | 1000 -- Đã trở về số dư ban đầu
Trong ví dụ trên:
- Giao dịch bắt đầu với việc trừ 100 từ tài khoản 1
- Khi cố gắng cộng 100 vào tài khoản 2, lệnh thất bại
- Hệ thống tự động rollback toàn bộ giao dịch
- Số dư tài khoản 1 trở về 1000 như ban đầu
- Không có thay đổi nào được lưu vào cơ sở dữ liệu
Điều này đảm bảo tính nguyên tử của giao dịch - hoặc là tất cả các thao tác đều thành công, hoặc là không có thao tác nào được thực hiện.
2. Consistency (Tính nhất quán)
Tính nhất quán đảm bảo rằng cơ sở dữ liệu luôn ở trạng thái hợp lệ trước và sau mỗi giao dịch. Các ràng buộc (constraints), khóa ngoại (foreign keys), và các quy tắc nghiệp vụ phải được tuân thủ.
- Định nghĩa: Sau khi một giao dịch hoàn tất, dữ liệu phải được chuyển từ một trạng thái nhất quán này sang trạng thái nhất quán khác.
- Ý nghĩa: Giao dịch phải tuân thủ tất cả các ràng buộc, quy tắc và quy luật của cơ sở dữ liệu (như khóa chính, khóa ngoại, unique...).
- Ví dụ:
- Không thể thêm một bản ghi đơn hàng mà không có khách hàng tương ứng trong bảng khách hàng (do ràng buộc khóa ngoại)
- Total_amount phải là số dương
- Các trường bắt buộc không được NULL
Ví dụ về Consistency:
Tình huống: Bạn có một bảng orders với ràng buộc khóa ngoại customer_id tham chiếu đến bảng customers.
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
total_amount DECIMAL(10,2),
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
Giao dịch không hợp lệ (vi phạm tính nhất quán):
START TRANSACTION;
INSERT INTO orders (id, customer_id, total_amount) VALUES (1, 999, -999); -- không tồn tại customer_id = 999
COMMIT;
❌ MySQL sẽ từ chối giao dịch này vì vi phạm ràng buộc khóa ngoại → Consistency được bảo vệ.
Khi thêm một đơn hàng mới, hệ thống sẽ kiểm tra:
- Customer_id phải tồn tại trong bảng customers
- Total_amount phải là số dương
- Các trường bắt buộc không được NULL
Yêu cầu đăng nhập
Vui lòng đăng nhập để truy cập nội dung này
Additional Resources
Course Guide
Comprehensive PDF guide with examples
GitHub Repository
Example code for all lessons
Discussion
Have a question about this lesson? Post it here and get answers from instructors and peers.
