0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Khám Phá Khái Niệm ACID Với PostgreSQL

Đăng vào 1 tuần trước

• 8 phút đọc

Giới Thiệu Về ACID

ACID là một từ viết tắt đại diện cho Atomicity (Nguyên Tử), Consistency (Tính Nhất Quán), Isolation (Tính Tách Biệt) và Durability (Tính Bền Vững), là một tập hợp các thuộc tính đảm bảo các giao dịch cơ sở dữ liệu được thực hiện một cách đáng tin cậy và dự đoán được. Những nguyên tắc này là nền tảng cho các hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) như PostgreSQL, đảm bảo tính toàn vẹn và độ tin cậy của dữ liệu, đặc biệt trong các ứng dụng quan trọng như ngân hàng hay quản lý kho. Bài viết này sẽ giải thích từng thuộc tính ACID, chứng minh cách PostgreSQL thực hiện chúng, và cung cấp các ví dụ thực tế.

ACID Là Gì?

Các thuộc tính ACID được thiết kế để đảm bảo rằng các giao dịch cơ sở dữ liệu được xử lý một cách đáng tin cậy, ngay cả trong trường hợp có lỗi, đồng thời xử lý và các lỗi hệ thống. Chúng đặc biệt quan trọng trong những hệ thống mà độ chính xác và tính nhất quán của dữ liệu là rất quan trọng, trái ngược với mô hình BASE được sử dụng trong một số cơ sở dữ liệu NoSQL.

Các Thành Phần Của ACID

  1. Atomicity (Nguyên Tử): Đảm bảo rằng một giao dịch được coi là một đơn vị không thể chia nhỏ—hoặc tất cả các thao tác thành công, hoặc không có thao tác nào được áp dụng.
  2. Consistency (Tính Nhất Quán): Đảm bảo rằng một giao dịch đưa cơ sở dữ liệu từ một trạng thái hợp lệ sang một trạng thái hợp lệ khác, tuân thủ tất cả các ràng buộc và quy tắc đã xác định.
  3. Isolation (Tính Tách Biệt): Đảm bảo rằng các giao dịch thực hiện độc lập, ngăn chặn sự can thiệp từ các giao dịch đồng thời.
  4. Durability (Tính Bền Vững): Đảm bảo rằng các giao dịch đã được xác nhận sẽ được lưu trữ vĩnh viễn, ngay cả khi có sự cố hệ thống xảy ra.

ACID Trong PostgreSQL

PostgreSQL, một hệ quản trị cơ sở dữ liệu mã nguồn mở mạnh mẽ, thực hiện các thuộc tính ACID một cách mạnh mẽ thông qua các tính năng tiên tiến của nó, làm cho nó trở thành một lựa chọn đáng tin cậy cho các ứng dụng yêu cầu sự toàn vẹn dữ liệu nghiêm ngặt. Dưới đây, chúng ta sẽ khám phá từng thuộc tính với các triển khai và ví dụ cụ thể của PostgreSQL.

1. Nguyên Tử (Atomicity)

Định Nghĩa: Nguyên tử đảm bảo rằng tất cả các thao tác trong một giao dịch được hoàn thành thành công, hoặc không có thao tác nào được áp dụng, ngăn chặn việc cập nhật một phần có thể dẫn đến sự không nhất quán của dữ liệu.

Triển Khai Trong PostgreSQL:

  • PostgreSQL sử dụng hệ thống quản lý giao dịch của nó, với các lệnh BEGIN, COMMIT, và ROLLBACK, để thực thi nguyên tử.
  • Nếu có lỗi xảy ra (ví dụ: vi phạm ràng buộc hoặc sự cố hệ thống), PostgreSQL sẽ tự động hoàn tác giao dịch, đảm bảo không có thay đổi nào được áp dụng.
  • Savepoints cho phép hoàn tác một phần trong giao dịch, cung cấp khả năng kiểm soát chi tiết.

Ví Dụ: Chuyển tiền 100 đô la giữa hai tài khoản ngân hàng.

sql Copy
BEGIN;

UPDATE accounts 
SET balance = balance - 100 
WHERE account_id = 'A' AND balance >= 100;

UPDATE accounts 
SET balance = balance + 100 
WHERE account_id = 'B';

-- Nếu cả hai cập nhật thành công, xác nhận giao dịch
COMMIT;

-- Nếu có lỗi xảy ra, hoàn tác đảm bảo không có thay đổi nào được áp dụng
-- ROLLBACK;

Giải Thích: Nếu việc trừ tiền từ Tài Khoản A thành công nhưng việc cộng tiền vào Tài Khoản B thất bại, PostgreSQL sẽ hoàn tác cả hai thao tác, đảm bảo nguyên tử.

2. Tính Nhất Quán (Consistency)

Định Nghĩa: Tính nhất quán đảm bảo rằng một giao dịch chuyển đổi cơ sở dữ liệu từ một trạng thái hợp lệ sang một trạng thái hợp lệ khác, tôn trọng tất cả các ràng buộc, chẳng hạn như khóa chính, khóa ngoại và ràng buộc kiểm tra.

Triển Khai Trong PostgreSQL:

  • PostgreSQL thực hiện các ràng buộc (ví dụ: PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE) trong quá trình giao dịch để duy trì tính toàn vẹn dữ liệu.
  • Hệ thống Multiversion Concurrency Control (MVCC) đảm bảo rằng mỗi giao dịch hoạt động trên một ảnh chụp nhất quán của cơ sở dữ liệu.
  • Các trigger và quy tắc có thể thực thi thêm các yêu cầu nhất quán tùy chỉnh.

Ví Dụ: Chèn một bản ghi với một ràng buộc.

sql Copy
CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INT CHECK (age >= 18)
);

BEGIN;
INSERT INTO employees (name, age) VALUES ('Alice', 25); -- Hợp lệ
INSERT INTO employees (name, age) VALUES ('Bob', 16);   -- Vi phạm ràng buộc CHECK
COMMIT;

Giải Thích: Câu lệnh INSERT thứ hai thất bại do ràng buộc age >= 18, khiến giao dịch bị hoàn tác, bảo toàn tính nhất quán của cơ sở dữ liệu.

3. Tính Tách Biệt (Isolation)

Định Nghĩa: Tính tách biệt đảm bảo rằng các giao dịch thực hiện độc lập, ngăn chặn việc thay đổi một phần của một giao dịch ảnh hưởng đến những giao dịch khác cho đến khi được xác nhận.

Triển Khai Trong PostgreSQL:

  • MVCC của PostgreSQL cung cấp cho mỗi giao dịch một ảnh chụp của cơ sở dữ liệu, tách biệt nó khỏi các thay đổi đồng thời.
  • Các mức độ tách biệt được hỗ trợ bao gồm:
    • Read Committed (mặc định): Các giao dịch chỉ thấy dữ liệu đã được xác nhận.
    • Repeatable Read: Ngăn chặn việc đọc không lặp lại bằng cách sử dụng một ảnh chụp nhất quán.
    • Serializable: Đảm bảo các giao dịch hoạt động như thể được thực thi tuần tự, ngăn chặn việc đọc ảo.
  • Các mức độ tách biệt được thiết lập bằng cách sử dụng SET TRANSACTION ISOLATION LEVEL.

Ví Dụ: Cập nhật đồng thời với Repeatable Read.

sql Copy
-- Giao dịch 1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE account_id = 'A'; -- Thấy số dư là 500
-- (Giao dịch khác cập nhật số dư thành 600)
SELECT balance FROM accounts WHERE account_id = 'A'; -- Vẫn thấy 500
COMMIT;

-- Giao dịch 2
BEGIN;
UPDATE accounts SET balance = 600 WHERE account_id = 'A';
COMMIT;

Giải Thích: MVCC đảm bảo Giao dịch 1 thấy một ảnh chụp nhất quán, tách biệt nó khỏi cập nhật của Giao dịch 2 cho đến khi nó được xác nhận.

4. Tính Bền Vững (Durability)

Định Nghĩa: Tính bền vững đảm bảo rằng một khi giao dịch đã được xác nhận, những thay đổi của nó sẽ được lưu trữ vĩnh viễn, ngay cả khi hệ thống gặp sự cố ngay sau đó.

Triển Khai Trong PostgreSQL:

  • PostgreSQL sử dụng Write-Ahead Logging (WAL) để ghi lại chi tiết giao dịch vào bộ nhớ không biến đổi trước khi xác nhận.
  • Cấu hình fsync đảm bảo dữ liệu được ghi thực sự vào đĩa.
  • Checkpoints tối ưu hóa việc phục hồi bằng cách đồng bộ hóa định kỳ trạng thái cơ sở dữ liệu với WAL.

Ví Dụ: Xác nhận một giao dịch.

sql Copy
BEGIN;
INSERT INTO orders (order_id, product, amount) VALUES (1, 'Laptop', 999.99);
COMMIT;

Giải Thích: Câu lệnh INSERT được ghi vào WAL trước khi hoàn tất COMMIT. Nếu máy chủ gặp sự cố, PostgreSQL sẽ phát lại WAL để phục hồi giao dịch đã được xác nhận, đảm bảo tính bền vững.

Các Tính Năng Cụ Thể Của PostgreSQL Hỗ Trợ ACID

  • MVCC: Cho phép tính nhất quán và tính tách biệt bằng cách cung cấp các ảnh chụp giao dịch, giảm xung đột trong các môi trường đồng thời.
  • WAL: Đảm bảo tính bền vững và hỗ trợ phục hồi sự cố bằng cách ghi lại tất cả các thay đổi.
  • Checkpoints: Cải thiện hiệu suất phục hồi bằng cách đánh dấu các trạng thái cơ sở dữ liệu ổn định.
  • Lệnh Giao Dịch: BEGIN, COMMIT, ROLLBACK, và SAVEPOINT cung cấp sự kiểm soát chính xác về các giao dịch.
  • Thực Thi Ràng Buộc: Xác thực tính toàn vẹn của dữ liệu với khóa chính, khóa ngoại và các trigger tùy chỉnh.

Ví Dụ Thực Tế: Chuyển Khoản Ngân Hàng

Một ví dụ hoàn chỉnh về chuyển khoản ngân hàng chứng minh tất cả các thuộc tính ACID.

sql Copy
CREATE TABLE accounts (
    account_id VARCHAR(10) PRIMARY KEY,
    balance NUMERIC CHECK (balance >= 0)
);

INSERT INTO accounts (account_id, balance) VALUES ('A', 500), ('B', 200);

BEGIN;
-- Kiểm tra số dư đủ
UPDATE accounts 
SET balance = balance - 100 
WHERE account_id = 'A' AND balance >= 100;

-- Ghi có cho người nhận
UPDATE accounts 
SET balance = balance + 100 
WHERE account_id = 'B';

-- Đảm bảo cả hai cập nhật thành công
COMMIT;

Giải Thích:

  • Nguyên Tử: Cả hai câu lệnh UPDATE thành công, hoặc cả hai được hoàn tác.
  • Tính Nhất Quán: Ràng buộc CHECK (balance >= 0) đảm bảo số dư hợp lệ.
  • Tính Tách Biệt: MVCC ngăn chặn các giao dịch khác thấy các cập nhật một phần.
  • Tính Bền Vững: WAL đảm bảo các thay đổi đã được xác nhận tồn tại sau khi xảy ra sự cố.

Kết Luận

Việc triển khai mạnh mẽ các thuộc tính ACID của PostgreSQL—thông qua MVCC, WAL, việc thực thi ràng buộc, và quản lý giao dịch—làm cho nó trở thành một lựa chọn đáng tin cậy cho các ứng dụng yêu cầu tính toàn vẹn dữ liệu cao. Dù là quản lý giao dịch tài chính, đơn hàng thương mại điện tử, hay dữ liệu doanh nghiệp, PostgreSQL đảm bảo các hoạt động nguyên tử, nhất quán, tách biệt và bền vững, cung cấp nền tảng vững chắc cho các hệ thống quan trọng.

Tài Liệu Tham Khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào