နားလည်ထားရမယ့် အချက်
PostgreSQL က consistency အတွက် implicit locks ယူပါတယ်။ `SELECT ... FOR UPDATE` က read-then-write race ကိုကာကွယ်နိုင်သော်လည်း lock duration ကိုတိုထားရပါတယ်။ Transactions နှစ်ခုက resources မတူသောအစီအစဉ်နဲ့ယူရင် deadlock ဖြစ်ပြီး PostgreSQL ကတစ်ခုကို abort လုပ်ကာ cycle ဖြတ်ပါတယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Seat inventory လို scenario မှာ available count ကို lock လုပ်ပြီးမှလျှော့မယ်။ Application တစ်ခုလုံးမှာ rows ကို ID ascending စသည့် consistent order နဲ့ lock လုပ်ခြင်း၊ timeout သတ်မှတ်ခြင်းနှင့် aborted transaction retry လုပ်ခြင်းတို့သုံးပါ။
အတူတူ စမ်းရေးကြည့်မယ်
BEGIN;
SET LOCAL lock_timeout = '2s';
SELECT seats_left
FROM app.course_sessions
WHERE session_id = 7
FOR UPDATE;
UPDATE app.course_sessions
SET seats_left = seats_left - 1
WHERE session_id = 7 AND seats_left > 0
RETURNING seats_left;
COMMIT;Concurrent booking တွင် negative inventory မဖြစ်အောင် serialized update ရမည်။၅ မိနစ် စမ်းကြည့်
Terminal နှစ်ခုမှာ row နှစ်ခုကို opposite order နဲ့ lock ကာ deadlock ဖြစ်စေပြီး error ကိုမှတ်ပါ။
သတိလေးတစ်ချက်
Lock wait ကို application hang လို့ပဲထင်ပြီး root blocker မရှာခြင်းက outage ကိုရှည်စေပါတယ်။
PostgreSQL — Explicit Locking — PostgreSQL Global Development Group