Hiểu Về ACID Trong MySQL
Chắc hẳn nhiều bạn đã nghe về bốn tính chất quan trọng cần đảm bảo khi xử lý transaction trong cơ sở dữ liệu, gồm tính nguyên tử, tính nhất quán, tính cô lập và tính bền vững, được gọi chung là ACID. Mặc dù có rất nhiều tài liệu về chủ đề này, nhưng bài viết này sẽ giúp bạn ôn lại một lần nữa và tìm hiểu cách MySQL đạt được những tiêu chuẩn này.
1. Tính Nguyên Tử (Atomicity)
Khái Niệm
Tính nguyên tử bảo đảm rằng toàn bộ thay đổi trong một transaction phải được thực hiện hoàn toàn hoặc không có thay đổi nào được thực hiện. Nếu có lỗi xảy ra, cơ sở dữ liệu sẽ trở về trạng thái ban đầu trước khi transaction bắt đầu. Về cơ bản, đó là quy tắc All or Nothing.
Ví Dụ
Hãy xem ví dụ về một giao dịch chuyển tiền: A chuyển cho B 100 đô la. Quy trình có thể bao gồm:
- Bắt đầu transaction
- Kiểm tra số dư tài khoản A
- Cập nhật giảm tiền từ tài khoản A
- Cập nhật tăng tiền vào tài khoản B
- Xác nhận transaction (Commit)
Nếu có sự cố xảy ra giữa các bước, như việc chưa kịp cập nhật cho B, tài khoản A sẽ được hoàn lại số tiền đã trừ.
Quản Lý Transaction Trong MySQL
MySQL xử lý transaction thông qua các lệnh sau:
- START TRANSACTION: Bắt đầu một transaction.
- COMMIT: Xác nhận và áp dụng tất cả các thay đổi.
- ROLLBACK: Hủy bỏ tất cả các thay đổi, đưa cơ sở dữ liệu về trạng thái trước khi transaction bắt đầu.
Log Quản Lý
MySQL sử dụng hai loại log để hỗ trợ tính nguyên tử:
- Redo Log: Ghi lại các thay đổi để áp dụng vào cơ sở dữ liệu, đảm bảo không mất dữ liệu sau khi commit.
- Undo Log: Ghi lại các thay đổi ngược lại, giúp khôi phục cơ sở dữ liệu khi rollback.
2. Tính Nhất Quán (Consistency)
Tính nhất quán đảm bảo rằng sau khi một transaction hoàn tất, cơ sở dữ liệu chuyển từ trạng thái hợp lệ này sang trạng thái hợp lệ khác. Nếu một lệnh vi phạm ràng buộc, toàn bộ transaction sẽ bị hủy bỏ.
Ví Dụ
Giả sử một cửa hàng quy định rằng số lượng tồn kho không thể âm. Nếu một sản phẩm có số lượng tồn kho là 10 và bán 2 sản phẩm, sau transaction, số lượng tồn kho còn lại phải là 8. Nếu có yêu cầu mua 10 sản phẩm khác, transaction đó sẽ bị từ chối.
Các Biện Pháp Đảm Bảo Tính Nhất Quán
MySQL duy trì tính toàn vẹn dữ liệu thông qua các ràng buộc:
- Primary Key: Bảo đảm mỗi hàng trong bảng là duy nhất.
- Foreign Key: Đảm bảo giá trị tồn tại trong bảng khác.
- Unique: Đảm bảo tất cả các giá trị trong cột là duy nhất.
- Not Null: Đảm bảo cột không chứa giá trị null.
3. Tính Bền Vững (Durability)
Tính bền vững đảm bảo rằng một khi transaction hoàn tất, các thay đổi của nó sẽ được lưu trữ vĩnh viễn trong hệ thống, ngay cả khi có sự cố xảy ra.
Cơ Chế Đảm Bảo Tính Bền Vững Trong MySQL
MySQL sử dụng ba cơ chế chính:
- Write Ahead Logging (WAL): Ghi trước thay đổi vào redo log trước khi lưu vào cơ sở dữ liệu.
- Doublewrite Buffer: Ghi dữ liệu vào bộ đệm trước khi ghi vào đĩa.
- Binary Log: Ghi lại tất cả các thay đổi để hỗ trợ khôi phục và nhân bản sau này.
4. Tính Cô Lập (Isolation)
Tính cô lập đảm bảo rằng các transaction diễn ra đồng thời không ảnh hưởng đến nhau. MySQL cung cấp bốn cấp độ cô lập:
- Read Uncommitted: Cho phép đọc dữ liệu chưa được commit.
- Read Committed: Chỉ cho phép đọc dữ liệu đã được commit.
- Repeatable Read: Giữ nguyên giá trị đọc được ở mọi thích hợp trong một transaction.
- Serializable: Đảm bảo tuần tự hoàn toàn giữa các transaction.
Vấn Đề Nảy Sinh Khi Không Đảm Bảo Tính Cô Lập
- Dirty Read: Đọc dữ liệu chưa được commit.
- Non-repeatable Read: Giá trị đọc thay đổi sau khi commit.
- Phantom Read: Kết quả truy vấn thay đổi do dữ liệu thêm vào hoặc xóa.
Kết Luận
Tóm lại, chúng ta đã đi qua bốn tính chất ACID của MySQL, qua đó giúp bạn hiểu rõ hơn về việc xử lý transaction trong cơ sở dữ liệu. Sự cân bằng giữa tính nhất quán và hiệu suất là điều quan trọng, và tuỳ thuộc vào yêu cầu của dự án, bạn có thể tối ưu hóa với các cấp độ cô lập khác nhau.
Nếu thấy bài viết hữu ích, đừng ngần ngại chia sẻ và cho tôi biết ý kiến của bạn trong phần bình luận. Bạn cũng có thể theo dõi thêm các bài viết khác của tôi trên blog cá nhân hoặc kết nối với tôi qua LinkedIn.
source: viblo