ACID trong MySQL là gì?

ACID là viết tắt của Atomicity, Consistency, Isolation, và Durability. Đây là bốn tính chất quan trọng đảm bảo tính toàn vẹn dữ liệu trong hệ quản trị cơ sở dữ liệu, bao gồm cả MySQL. Khi một hệ thống tuân thủ ACID, nó đảm bảo rằng các giao dịch (transactions) được thực thi một cách đáng tin cậy, ngay cả khi có sự cố xảy ra (như mất điện, lỗi hệ thống, hoặc lỗi phần mềm).

1. Atomicity (Tính nguyên tử)

  • Tính nguyên tử đảm bảo rằng một giao dịch sẽ xảy ra “tất cả hoặc không có gì”. Điều này có nghĩa là nếu bất kỳ phần nào của giao dịch không hoàn thành, toàn bộ giao dịch sẽ bị hủy bỏ (rollback) và cơ sở dữ liệu sẽ không bị ảnh hưởng bởi bất kỳ thay đổi nào từ giao dịch đó.
  • Ví dụ: Khi chuyển tiền từ tài khoản A sang tài khoản B, nếu việc trừ tiền ở 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, thì giao dịch sẽ bị hủy bỏ và không có sự thay đổi nào xảy ra trong cả hai tài khoả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 khi giao dịch hoàn thành. Một giao dịch chỉ được coi là hợp lệ nếu nó giữ cho cơ sở dữ liệu trong một trạng thái nhất quán theo các quy tắc xác định của hệ thống.
  • Ví dụ: Nếu có một quy tắc là số dư tài khoản không được phép âm, thì khi thực hiện giao dịch rút tiền, hệ thống sẽ kiểm tra quy tắc đó và nếu vi phạm, giao dịch sẽ bị hủy.

3. Isolation (Tính cô lập)

  • Tính cô lập đảm bảo rằng các giao dịch đang chạy đồng thời sẽ không ảnh hưởng đến nhau. Một giao dịch không được nhìn thấy các thay đổi do các giao dịch khác thực hiện cho đến khi các giao dịch đó hoàn thành.
  • MySQL cung cấp nhiều mức độ cách ly khác nhau như: Read Uncommitted, Read Committed, Repeatable Read, và Serializable.Ví dụ: Trong một giao dịch, nếu bạn đang đọc dữ liệu từ cơ sở dữ liệu, bạn sẽ không thấy những thay đổi chưa hoàn thành từ một giao dịch khác, đảm bảo rằng dữ liệu bạn làm việc vẫn chính xác.

4. Durability (Tính bền vững)

  • Tính bền vững đảm bảo rằng khi một giao dịch đã hoàn thành, dữ liệu đã được cam kết sẽ được lưu trữ vĩnh viễn, ngay cả khi hệ thống gặp sự cố sau đó (như mất điện hoặc lỗi hệ thống).
  • Ví dụ: Khi một giao dịch hoàn thành thành công, dữ liệu sẽ được ghi vào ổ đĩa (hoặc một phương tiện lưu trữ vĩnh viễn khác) và vẫn tồn tại ngay cả khi hệ thống bị hỏng.

Ví dụ về ACID trong MySQL:

Giả sử bạn có bảng accounts với các cột account_idbalance, và bạn muốn thực hiện giao dịch chuyển tiền từ tài khoản A sang tài khoản B. Đây là cách MySQL đảm bảo tính chất ACID của giao dịch này:

START TRANSACTION;

-- Trừ tiền từ tài khoản A
UPDATE accounts
SET balance = balance - 100
WHERE account_id = 'A';

-- Cộng tiền vào tài khoản B
UPDATE accounts
SET balance = balance + 100
WHERE account_id = 'B';

-- Kiểm tra số dư của cả hai tài khoản để đảm bảo tính nhất quán
-- Nếu một trong các bước trên thất bại, ta có thể rollback

COMMIT;

  • Atomicity: Nếu có bất kỳ lệnh nào trong giao dịch thất bại (ví dụ tài khoản A không có đủ tiền), toàn bộ giao dịch sẽ bị rollback và không có thay đổi nào được ghi vào cơ sở dữ liệu.
  • Consistency: Nếu giao dịch hoàn thành, cơ sở dữ liệu sẽ ở trạng thái nhất quán, đảm bảo rằng số dư trong cả hai tài khoản được cập nhật chính xác và tuân theo các ràng buộc (ví dụ như số dư không âm).
  • Isolation: Nếu có một giao dịch khác đang thực hiện việc đọc số dư tài khoản, nó sẽ không thấy các thay đổi cho đến khi giao dịch này hoàn thành và commit.
  • Durability: Khi giao dịch đã được commit, các thay đổi sẽ được ghi vĩnh viễn vào cơ sở dữ liệu, ngay cả khi sau đó hệ thống gặp sự cố.

Cấu hình để đảm bảo ACID trong MySQL

Trong MySQL, engine InnoDB hỗ trợ đầy đủ các tính chất ACID. Bạn có thể kiểm tra và tối ưu hóa các cài đặt để đảm bảo rằng các giao dịch luôn tuân theo ACID:

  • innodb_flush_log_at_trx_commit: Đảm bảo tính Durability. Nếu thiết lập giá trị là 1, MySQL sẽ ghi nhật ký giao dịch vào đĩa mỗi khi một giao dịch được commit, đảm bảo dữ liệu sẽ không bị mất khi có sự cố.
  • innodb_buffer_pool_size: Tối ưu hóa bộ nhớ đệm InnoDB để lưu trữ dữ liệu tạm thời trong bộ nhớ, giúp cải thiện hiệu suất và tính bền vững của hệ thống.
  • Mức cách ly (Isolation Level): Bạn có thể thiết lập mức cách ly phù hợp với ứng dụng của mình bằng cách sử dụng câu lệnh:
    SET SESSION TRANSACTION ISOLATION LEVEL [LEVEL];
    

    Ví dụ:

    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    

    Các mức cách ly phổ biến trong MySQL bao gồm:

  • READ UNCOMMITTED: Thấp nhất, cho phép thấy dữ liệu chưa commit.
  • READ COMMITTED: Thấy được dữ liệu đã commit.
  • REPEATABLE READ: Đảm bảo rằng dữ liệu đã đọc trong suốt giao dịch là không đổi.
  • SERIALIZABLE: Cô lập giao dịch ở mức cao nhất, mọi giao dịch được xử lý tuần tự.

Tổng kết

ACID là tập hợp bốn tính chất quan trọng trong MySQL để đảm bảo sự an toàn và toàn vẹn dữ liệu khi thực hiện các giao dịch. Các tính chất này giúp bảo vệ cơ sở dữ liệu khỏi các lỗi phát sinh trong quá trình giao dịch và đảm bảo tính bền vững của dữ liệu.