</>
⌕
Senior #locking#concurrency#version#select-for-update

Optimistic locking và pessimistic locking khác nhau thế nào?

⚡ Trả lời nhanh

Pessimistic khoá dòng ngay khi đọc (SELECT ... FOR UPDATE) để chặn xung đột, phù hợp khi tranh chấp cao. Optimistic không khoá, dùng cột version và kiểm tra khi UPDATE; nếu 0 dòng bị ảnh hưởng thì xung đột và phải retry, phù hợp khi tranh chấp thấp.

-- Pessimistic
BEGIN;
SELECT stock FROM products WHERE id = 7 FOR UPDATE;  -- khoá dòng
UPDATE products SET stock = stock - 1 WHERE id = 7;
COMMIT;

-- Optimistic
SELECT stock, version FROM products WHERE id = 7;    -- version = 5
UPDATE products
SET stock = 9, version = version + 1
WHERE id = 7 AND version = 5;                        -- 0 row => xung đột, đọc lại và thử lại
PessimisticOptimistic
Khoágiữ suốt transactionkhông
Tranh chấp caotốtnhiều retry
Rủi rodeadlock, giảm throughputlãng phí công việc khi retry
🃏 Ôn bằng flashcard