I. Giới thiệu
Trong quá trình xây dựng một sàn thương mại điện tử, có thể xảy ra trường hợp tồn kho của một sản phẩm chỉ còn 1, nhưng có tới 2 khách hàng cùng đặt hàng đồng thời. Làm thế nào để hệ thống xử lý tình huống này mà không để xảy ra sai sót? Đây là một trong những thách thức phổ biến liên quan đến việc xử lý nhiều giao dịch đồng thời.
Tình huống này thường dẫn đến hiện tượng gọi là race condition
, nơi mà các giao dịch song song cùng tranh chấp quyền truy cập dữ liệu, tạo ra tình trạng sai lệch như lost update
.
Bài viết này sẽ khám phá các phương pháp để xử lý hiệu quả tình huống này, từ những cách đơn giản đến các giải pháp tiên tiến được sử dụng trong các hệ thống phân tán.
II. Các phương pháp xử lý
1. Atomic Operation
Atomic
đề cập đến một loạt thao tác mà phải thực hiện như một đơn vị duy nhất, nghĩa là tất cả sẽ được thực hiện hoặc không có thao tác nào được thực hiện. Điều này giúp tăng cường tính toàn vẹn dữ liệu, vì không có sự can thiệp từ bên ngoài xảy ra trong lúc thao tác.
Rất nhiều người nhầm rằng nếu không sử dụng các phương pháp khóa, việc bảo vệ dữ liệu sẽ không khả thi. Thực tế, trong các cơ sở dữ liệu hỗ trợ ACID, những câu lệnh như UPDATE
và DELETE
tự động áp dụng cơ chế row-level locking để đảm bảo tính toàn vẹn dữ liệu.
Ví dụ về Atomic Operation
Khi thực hiện câu lệnh UPDATE
, hệ thống sẽ khóa các row phù hợp với điều kiện để đảm bảo rằng chỉ một giao dịch được thực hiện tại một thời điểm. Bởi vậy, nếu lượng hàng tồn kho giảm xuống âm, vấn đề lost update sẽ không xảy ra.
Giải pháp an toàn hơn:
UPDATE inventory
SET quantity = quantity - 1
WHERE id = 123 AND quantity > 0;
Câu lệnh này sẽ đảm bảo rằng chỉ có một giao dịch thực hiện thành công. Nếu
quantity
là 0, giao dịch còn lại sẽ bị từ chối, ngăn chặn việc sai lệch dữ liệu.
Ưu điểm và Nhược điểm
- Ưu điểm: Đơn giản và dễ triển khai với hiệu suất tốt cho hệ thống nhỏ hoặc vừa.
- Nhược điểm: Phương pháp này không phù hợp với các tác vụ phức tạp có nhiều điều kiện.
2. Mức độ Isolated
ACID
là tập hợp các thuộc tính của giao dịch trong hệ quản trị cơ sở dữ liệu với mục tiêu đảm bảo tính nhất quán và an toàn của dữ liệu. Trong đó, yếu tố Isolation
quyết định cách mà hệ thống xử lý các xung đột dữ liệu xảy ra khi có nhiều người dùng thao tác đồng thời.
Mức độ Isolated có 4 cấp độ khác nhau. Để hiểu rõ hơn, chúng ta sẽ điểm qua các cấp độ này và cai thiện khả năng xử lý lost update
.
2.1. Read uncommitted
Mức độ này cho phép một giao dịch đọc dữ liệu chưa được commit từ một giao dịch khác, dẫn đến việc có thể xảy ra hiện tượng dirty read
. Điều này có thể dẫn đến việc sai lệch dữ liệu mà không thể xử lý được tình huống lost update
.
2.2. Read committed
Mức độ này chỉ cho phép giao dịch đọc dữ liệu đã được commit, nhưng vẫn không thể ngăn chặn tình trạng lost update
. Nhiều giao dịch có thể cùng đọc và cập nhật cùng một lượng tồn kho, dẫn đến việc cập nhật sai lệch.
2.3. Repeatable read
Mức độ này đảm bảo rằng dữ liệu sẽ không thay đổi giữa các lần đọc trong một giao dịch. Tuy nhiên, việc xử lý xung đột dữ liệu phụ thuộc vào cơ chế mà cơ sở dữ liệu sử dụng, như pessimistic locking
hoặc MVCC
(Multi-Version Concurrency Control).
2.4. Serializable
Đây là cấp độ cao nhất, yêu cầu các giao dịch phải được thực hiện tuần tự, ngăn chặn tình trạng lost update
một cách triệt để. Tuy nhiên, độ phức tạp và hiệu suất có thể ảnh hưởng trong các hệ thống quy mô lớn.
3. Pessimistic Lock
Pessimistic lock
là một chiến lược mà các bản ghi sẽ được khóa trước khi thực hiện các thao tác thay đổi. Điều này đảm bảo không có giao dịch nào có thể tác động lên dữ liệu đang bị khóa cho đến khi giao dịch hoàn tất.
Ưu điểm và Nhược điểm của Pessimistic Lock
- Ưu điểm: Bảo đảm tính toàn vẹn cao, rất phù hợp cho hệ thống có nhiều giao dịch xung đột.
- Nhược điểm: Gây ra tình trạng
deadlock
và thường không hiệu quả trong các hệ thống phân tán do khó đồng bộ hóa khóa.
4. Optimistic Lock
Optimistic lock
cho phép nhiều giao dịch truy cập và thay đổi dữ liệu mà không cần phải khóa ngay. Hệ thống sẽ kiểm tra xung đột tại thời điểm commit, giúp giảm thiểu tình trạng deadlock và nâng cao tính thanh khoản.
Ưu điểm và Nhược điểm của Optimistic Lock
- Ưu điểm: Hiệu quả cao hơn đáng kể so với
pessimistic lock
trong môi trường ít xung đột. - Nhược điểm: Không phù hợp trong môi trường có tần suất giao dịch cao, vì các giao dịch có thể phải retry liên tục.
5. Distributed Lock
Trong các hệ thống phân tán, distributed lock
là một giải pháp hiệu quả chống lại các vấn đề như lost update
. Điều này đảm bảo chỉ một giao dịch được phép thực hiện thao tác thay đổi dữ liệu tại một thời điểm.
6. Sử dụng Queue
Sử dụng Queue
để xử lý các yêu cầu theo thứ tự (FIFO) cũng là một phương pháp hiệu quả giúp đảm bảo tính nhất quán của dữ liệu.
7. Giải pháp Reserved Counter
Reserved Counter
là phương pháp giúp giảm áp lực cho database trong các chiến dịch flash sale, bằng cách sử dụng bộ đếm lưu trong bộ nhớ cho phép người dùng giữ chỗ trong thời gian giới hạn trước khi cập nhật tồn kho thực tế trong cơ sở dữ liệu.
III. Kết luận
Lost update
là thách thức lớn trong các hệ thống giao dịch. Các giải pháp mà bài viết trình bày như Atomic Operation
, Pessimistic Lock
, Optimistic Lock
, và các phương pháp khác đều có lợi và hạn chế riêng. Việc lựa chọn phương pháp phù hợp cần cân nhắc dựa trên yêu cầu cụ thể của hệ thống, bao gồm tính nhất quán, hiệu suất và tính phức tạp của hệ thống. Qua đó, bạn có thể đảm bảo rằng hệ thống của mình vận hành ổn định và chính xác trong mọi tình huống.
source: viblo