0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Sự Khác Biệt Giữa Idempotency và Optimistic Locking: Tìm Hiểu Hai Khái Niệm Quan Trọng Trong Ngành Công Nghệ Thông Tin

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

• 3 phút đọc

Phân Biệt Idempotency Và Optimistic Locking

Gần đây, có rất nhiều người nhầm lẫn giữa hai khái niệm Idempotency và Optimistic Locking trong lĩnh vực công nghệ thông tin. Trong bài viết này, chúng ta sẽ cùng tìm hiểu rõ ràng về hai khái niệm này, cách chúng hoạt động và lý do tại sao không nên nhầm lẫn giữa chúng.

1. Idempotency

Idempotency là tính chất của một số thao tác trong toán học và khoa học máy tính, cho phép thực hiện nhiều lần mà không làm thay đổi kết quả sau lần thực hiện đầu tiên.

Định Nghĩa Cụ Thể

Một thao tác được coi là idempotent nếu khi được gọi nhiều lần thì hệ thống vẫn trả về cùng một kết quả mà không ảnh hưởng đến trạng thái của hệ thống.

Ví Dụ Cụ Thể

Chẳng hạn, khi bạn gọi một API với phương thức GET để lấy trạng thái của một giao dịch thanh toán:

Copy
GET http://api.example.com/payment/status/12345

Kết quả trả về luôn giống nhau:

Copy
{
    "transactionId": "12345",
    "status": "SUCCESS",
    "amount": 100.00
}

Ngược lại, với phương thức POST, nếu bạn thực hiện gọi API thanh toán nhiều lần, sẽ có nhiều giao dịch phát sinh:

Copy
POST http://api.example.com/payment/charge

Payload:
{
    "userId": "56789",
    "amount": 100.00,
    "paymentMethod": "credit_card"
}

Mỗi lần gọi sẽ tạo ra những giao dịch riêng biệt, làm ảnh hưởng đến số dư khả dụng.

Tại Sao Idempotency Quan Trọng?

Idempotency là rất quan trọng vì trong trường hợp các thao tác thanh toán bị thực hiện nhiều lần do lỗi, ví dụ như lỗi mạng hoặc sai sót trong xử lý yêu cầu, bạn có thể gặp tình trạng khách hàng bị trừ tiền nhiều lần cho cùng một sản phẩm. Điều này có thể gây ra sự không hài lòng cho người dùng và dẫn đến mất uy tín cho hệ thống.

2. Optimistic Locking

Optimistic Locking là phương pháp được sử dụng để đảm bảo rằng dữ liệu không bị ghi đè khi nhiều luồng thực hiện cập nhật cùng một bản ghi. Cách thức hoạt động của Optimistic Locking dựa trên cơ chế Compare and Swap (CAS). Nó sẽ so sánh trạng thái hiện tại của dữ liệu trước khi thực hiện thay đổi.

Cách Hoạt Động

Ví dụ, khi bạn thanh toán cho một ly cà phê qua ứng dụng ngân hàng:

plaintext Copy
SELECT balance, version FROM balance_tab WHERE uid=$uid;

If ($balance > $price) {
    $new_balance = $balance - $price;
    $version_new = $version + 1;
} else {
    return "not enough balance";
}

UPDATE balance_tab SET balance=$new_balance, version=$version_new 
WHERE uid=$uid AND version=$version;

Optimistic Locking không thực sự khóa tài nguyên mà chỉ so sánh phiên bản của dữ liệu để xác định xem có ai đã cập nhật dữ liệu trước đó hay không. Nếu không, nó mới thực hiện việc ghi dữ liệu mới.

3. Sự Khác Biệt Giữa Idempotency và Optimistic Locking

Nhiều người cho rằng Optimistic Locking có thể tạo nên tính Idempotency cho API. Tuy nhiên, đó là một sự nhầm lẫn nghiêm trọng.

Ví dụ Cụ Thể

Khi bạn mua ly cà phê, nếu tài khoản bị trừ tiền nhưng do lỗi mạng, yêu cầu sẽ được gửi lại. Dưới đây là luồng dữ liệu:

  • Yêu cầu 1: Cập nhật số dư thành công nhưng có lỗi mạng.
  • Yêu cầu 2: Client gửi lại yêu cầu nhưng trạng thái đã thay đổi, dẫn đến lỗi không đủ tiền.

Điều này cho thấy chỉ sử dụng Optimistic Locking không đảm bảo tính Idempotency cho API. Để có tính Idempotency, cần có các biện pháp bổ sung khác.

4. Kết Luận

Idempotency và Optimistic Locking là hai khái niệm có ý nghĩa rất khác nhau. Optimistic Locking giúp giảm thiểu tình trạng ghi đè dữ liệu, trong khi Idempotency đảm bảo rằng một API có thể được gọi nhiều lần mà vẫn chỉ cập nhật dữ liệu một lần duy nhất. Mặc dù có những trường hợp mà Optimistic Locking có thể góp phần tạo nên Idempotency, nhưng điều quan trọng là cần hiểu rõ bản chất của từng khái niệm để ứng dụng đúng.

Nguồn tham khảo: Zong W.B.
source: viblo

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