Khám Phá Sâu Về Giao Dịch Trong Cơ Sở Dữ Liệu (Transaction)
Hầu hết những ai đọc bài viết này đều đã hiểu giao dịch (transaction) được sinh ra nhằm mục đích gì: Đảm bảo rằng một quá trình được thực hiện hoàn chỉnh từ đầu đến cuối và có thể quay lại trạng thái dữ liệu ban đầu nếu xảy ra lỗi trong quá trình thực thi. Bài viết này sẽ đào sâu vào nhiều khía cạnh thú vị của giao dịch trong các hệ thống cơ sở dữ liệu.
1. Khái Niệm Cơ Bản Về Giao Dịch
Cuối những năm 2000, cơ sở dữ liệu NoSQL bắt đầu trở nên phổ biến, mang lại nhiều lựa chọn cho mô hình dữ liệu khi giới thiệu các phương thức sao chép (replication) và phân vùng (partitioning). Giao dịch trở thành một yếu tố thay đổi quan trọng trong bước chuyển dịch này, khi mà nhiều thế hệ cơ sở dữ liệu mới không còn hỗ trợ giao dịch, hoặc chỉ áp dụng một số điều kiện đơn giản hơn.
1.1 Tính Chất ACID
Tính chất ACID (Atomicity, Consistency, Isolation, Durability) là nền tảng của bất kỳ một giao dịch nào trong cơ sở dữ liệu:
- Atomicity (Tính Nguyên Tử): Giao dịch phải thực hiện hoàn toàn hoặc không thực hiện.
- Consistency (Tính Nhất Quán): Dữ liệu phải được duy trì ở trạng thái hợp lệ trong mọi thời điểm. Tính nhất quán phụ thuộc vào cả cơ sở dữ liệu và ứng dụng.
- Isolation (Tính Độc Lập): Mỗi giao dịch phải hoạt động độc lập, không bị ảnh hưởng bởi các giao dịch khác.
- Durability (Tính Bền Vững): Dữ liệu phải được lưu trữ an toàn, ngay cả trong trường hợp phần cứng gặp sự cố.
Đối với các cơ sở dữ liệu đơn điểm, điều này có nghĩa là dữ liệu cần được lưu trên bộ nhớ không biến đổi như HDD hoặc SSD, thường kèm theo cơ chế ghi trước (write-ahead log) để hỗ trợ khôi phục.
1.2 Hoạt Động Đối Tượng Đơn và Đối Tượng Đa
Giao dịch có thể ảnh hưởng tới đối tượng đơn lẻ hoặc nhiều đối tượng. Với đối tượng đơn lẻ, tất cả các cơ sở dữ liệu cần đảm bảo rằng việc cập nhật không làm dữ liệu trở nên không hợp lệ.
Khi làm việc với đối tượng đa, việc ổn định dữ liệu trở nên phức tạp hơn. Trong cơ sở dữ liệu quan hệ, khi thêm nhiều record có quan hệ khóa ngoại, chúng ta cần đảm bảo rằng tất cả các mối quan hệ này đều hợp lệ. Trong các cơ sở dữ liệu tài liệu, các trường cần được cập nhật thường nằm trong cùng một tài liệu. Bên cạnh đó, việc cập nhật các chỉ mục cũng cần phải được thực hiện đồng thời với việc cập nhật bản ghi.
2. Mức Độ Cách Ly Yếu
2.1 Đọc Đã Được Cam Kết (Read Committed)
Mức cách ly này giúp loại bỏ hai vấn đề chính: đọc dơ (dirty read) và ghi dơ (dirty write).
- Đối với ghi dơ, hầu hết các cơ sở dữ liệu sử dụng khóa cấp độ hàng (row-level lock) để đảm bảo rằng không có giao dịch nào có thể đọc dữ liệu khi một giao dịch khác đang ghi.
2.2 Cách Ly Hình Ảnh (Snapshot Isolation) Và Đọc Lặp Lại (Repeatable Read)
Snapshot Isolation cho phép mỗi giao dịch đọc một phiên bản nhất quán của cơ sở dữ liệu, điều này giúp giải quyết vấn đề không nhất quán trong các đọc nhiều đối tượng. Mặc dù tính năng này rất phổ biến, nhưng có sự nhầm lẫn trong cách gọi tên và triển khai giữa các hệ quản trị cơ sở dữ liệu khác nhau.
2.3 Ngăn Chặn Mất Cập Nhật
Vấn đề mất cập nhật có thể xảy ra trong chu kỳ đọc-sửa-ghi, và có nhiều phương pháp để ngăn chặn tình trạng này. Bao gồm việc sử dụng khóa độc quyền, locking, hoặc tự động phát hiện và hủy bỏ giao dịch nếu nhận diện được mất cập nhật.
2.4 Việc Kiểm Soát Mâu Thuẫn Và Sao Chép
Trong các hệ thống sao chép, công việc ngăn chặn mất cập nhật trở nên phức tạp hơn. Các phương pháp như tạo nhiều phiên bản xung đột hoặc sử dụng các phép toán giao hoán giúp duy trì tính nhất quán dữ liệu trong việc đồng bộ hóa.
3. Tính Dãy Tường (Serialization) (Sẽ Tiếp Tục)
Bài viết trênđã khám phá một số khía cạnh cơ bản và nâng cao liên quan đến giao dịch trong cơ sở dữ liệu. Nội dung tiếp theo sẽ đi sâu hơn về tính dãy tường và cách nó ảnh hưởng đến các giao dịch phức tạp trong cơ sở dữ liệu.
source: viblo