đ Locking (āϞāĻāĻŋāĻ)
āĻĄā§āĻāĻžāĻŦā§āϏ⧠āĻāĻāĻžāϧāĻŋāĻ āĻāĻāĻāĻžāϰ/āĻĒā§āϰāϏā§āϏ āĻāĻāĻ āĻĄā§āĻāĻž āĻāĻāϏāĻžāĻĨā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϤ⧠āĻāĻžāĻāϞ⧠āϏāĻāĻāϰā§āώ (conflict) āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻ concurrency āϏāĻŽāϏā§āϝāĻž āϏāĻžāĻŽāϞāĻžāϤ⧠āĻĻā§āĻāĻŋ āĻāύāĻĒā§āϰāĻŋā§ āĻā§āĻļāϞ āĻšāϞā§:
- Optimistic Locking (āĻāĻļāĻžāĻŦāĻžāĻĻā§ āϞāĻāĻŋāĻ)
- Pessimistic Locking (āύāĻŋāϰāĻžāĻļāĻžāĻŦāĻžāĻĻā§ āϞāĻāĻŋāĻ)
āύāĻŋāĻā§ āĻāĻā§ā§āϰ āϧāĻžāϰāĻŖāĻž, āĻāĻžāĻā§āϰ āϧāĻžāĻĒ, PostgreSQL āĻāĻĻāĻžāĻšāϰāĻŖ, āĻ āĻŦāĻžāϏā§āϤāĻŦ āĻĒā§āϰā§ā§āĻ āĻĻā§āĻāĻžāύ⧠āĻšāϞā§āĨ¤
đ§ Optimistic Locking (āĻāĻļāĻžāĻŦāĻžāĻĻā§ āϞāĻāĻŋāĻ)
đ āϧāĻžāϰāĻŖāĻž
Optimistic Locking āϧāϰ⧠āύā§ā§ āϝ⧠āĻāĻāĻ āĻĄā§āĻāĻžā§ āĻāĻāϏāĻžāĻĨā§ āĻāĻĒāĻĄā§āĻā§āϰ āϏāĻŽā§āĻāĻžāĻŦāύāĻž āĻāĻŽāĨ¤ āϤāĻžāĻ āĻļā§āϰā§āϤ⧠āĻā§āύ⧠āϞāĻ āϧāϰāĻž āĻšā§ āύāĻž â āĻŦāϰāĻ āĻāĻĒāĻĄā§āĻā§āϰ āϏāĻŽā§ āĻĻā§āĻāĻž āĻšā§ āĻĄā§āĻāĻž āĻāĻā§āϰ āĻŽāϤ⧠āĻāĻā§ āĻāĻŋ āύāĻžāĨ¤ āϝāĻĻāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšā§ā§ āϝāĻžā§, āϤāĻžāĻšāϞ⧠āĻāĻĒāĻĄā§āĻ āĻŦā§āϝāϰā§āĻĨ āĻšāĻŦā§ (conflict)āĨ¤
âī¸ āĻāĻžāĻā§āϰ āϧāĻžāĻĒ
- āĻā§āĻŦāĻŋāϞ⧠āĻāĻāĻāĻŋ
versionāĻŦāĻžupdated_atāĻāϞāĻžāĻŽ āϰāĻžāĻāĻž āĻšā§āĨ¤ - āĻĄā§āĻāĻž āϰāĻŋāĻĄ āĻāϰāĻžāϰ āϏāĻŽā§ āϏā§āĻ
versionāύā§āĻ āĻāϰāĻž āĻšā§āĨ¤ - āĻāĻĒāĻĄā§āĻ āĻāϰāĻžāϰ āϏāĻŽā§ āĻļāϰā§āϤ⧠(
WHERE id = ? AND version = ?) āĻŽāĻŋāϞāĻŋā§ā§ āĻĻā§āĻāĻž āĻšā§āĨ¤ - āϝāĻĻāĻŋ āĻ āύā§āϝ āĻā§āĻ āĻāϰ āĻŽāϧā§āϝ⧠āĻāĻĒāĻĄā§āĻ āĻāϰā§, āϤāĻžāĻšāϞ⧠āĻā§āύ⧠āϰ⧠āĻāĻĒāĻĄā§āĻ āĻšāĻŦā§ āύāĻž (0 rows affected)āĨ¤
đ§ž PostgreSQL āĻāĻĻāĻžāĻšāϰāĻŖ
-- Version āĻāϞāĻžāĻŽ āϝā§āĻ
ALTER TABLE accounts ADD COLUMN version INT NOT NULL DEFAULT 0;
-- Read (āϧāϰāĻž āϝāĻžāĻ version = N)
SELECT id, balance, version FROM accounts WHERE id = 1;
-- Update with version check
UPDATE accounts
SET balance = balance - 100,
version = version + 1
WHERE id = 1 AND version = N;
-- āϝāĻĻāĻŋ rows_affected = 0 â āĻ
āύā§āϝ āĻā§āĻ āĻāĻā§ āĻāĻĒāĻĄā§āĻ āĻāϰā§āĻā§â āϏā§āĻŦāĻŋāϧāĻž
- āĻā§āύ⧠āϞāĻ āύāĻž āϧāϰ⧠āĻāĻžāĻ āĻšā§ â āĻāĻā§āĻ concurrency āĻ āĻĻā§āϰā§āϤ performanceāĨ¤
- conflict āĻāĻŽ āĻšāϞ⧠āĻāĻāĻŋ āϏāĻŦāĻā§ā§ā§ āĻāĻžāϰā§āϝāĻāϰāĨ¤
â ī¸ āĻ āϏā§āĻŦāĻŋāϧāĻž
- āϏāĻāĻāϰā§āώ āĻšāϞ⧠āϰāĻŋāĻā§āϰāĻžāĻ āĻŦāĻž merge logic āϞāĻžāĻāĻŦā§āĨ¤
- write-heavy āϏāĻŋāϏā§āĻā§āĻŽā§ āĻŦāĻžāϰāĻŦāĻžāϰ conflict āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
đĄ āĻāĻŋāĻĒāϏ
- PostgreSQL-āĻāϰ
xmināϏāĻŋāϏā§āĻā§āĻŽ āĻāϞāĻžāĻŽ āĻĻāĻŋā§ā§āĻ version āĻā§āϰā§āϝāĻžāĻ āĻāϰāĻž āϝāĻžā§āĨ¤ āϤāĻŦā§ āϏā§āĻĒāώā§āĻversionāĻāϞāĻžāĻŽ āϰāĻžāĻāĻž āϏāĻŦāĻā§ā§ā§ āϏāĻšāĻāĨ¤
đĄī¸ Pessimistic Locking (āύāĻŋāϰāĻžāĻļāĻžāĻŦāĻžāĻĻā§ āϞāĻāĻŋāĻ)
đ āϧāĻžāϰāĻŖāĻž
āϧāϰ⧠āύā§ā§āĻž āĻšā§, āĻāĻāĻ āĻĄā§āĻāĻžā§ āĻāĻāϏāĻžāĻĨā§ āĻāĻĒāĻĄā§āĻ āĻšāĻā§āĻžāϰ āϏāĻŽā§āĻāĻžāĻŦāύāĻž āĻŦā§āĻļāĻŋāĨ¤ āϤāĻžāĻ āĻĄā§āĻāĻž āϰāĻŋāĻĄ āĻāϰāĻžāϰ āϏāĻŽā§āĻ āϞāĻ āϧāϰāĻž āĻšā§, āϝāĻžāϤ⧠āĻ āύā§āϝ āĻā§āĻ āĻāĻĒāĻĄā§āĻ āύāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
âī¸ āĻāĻžāĻā§āϰ āϧāĻžāĻĒ
- āĻā§āϰāĻžāύā§āϏā§āϝāĻžāĻāĻļāύ āĻļā§āϰ⧠āĻšā§āĨ¤
- SELECT āĻāϰāĻžāϰ āϏāĻŽā§
FOR UPDATEāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§āĨ¤ - āĻā§āϰāĻžāύā§āϏā§āϝāĻžāĻāĻļāύ āĻļā§āώ āύāĻž āĻšāĻā§āĻž āĻĒāϰā§āϝāύā§āϤ āĻ āύā§āϝ writer/readers āĻ āĻĒā§āĻā§āώāĻž āĻāϰāĻŦā§āĨ¤
đ§ž PostgreSQL āĻāĻĻāĻžāĻšāϰāĻŖ
BEGIN;
-- āĻāĻžāϰā§āĻā§āĻ āϰā§āĻāϰā§āĻĄ āϞāĻ
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- āύāĻŋāϰāĻžāĻĒāĻĻā§ āĻāĻĒāĻĄā§āĻ
UPDATE accounts SET balance = balance + 100 WHERE id = 1;
COMMIT;āϤāĻžā§āĻā§āώāĻŖāĻŋāĻ āĻŦā§āϝāϰā§āĻĨāϤāĻž (wait āύāĻž āĻāϰā§)
SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT; -- āϞāĻ āĻĨāĻžāĻāϞ⧠error āĻĻā§ā§Queue āĻŦāĻž Worker pattern-āĻ
SELECT id
FROM jobs
WHERE status = 'pending'
FOR UPDATE SKIP LOCKED
LIMIT 10;â āϏā§āĻŦāĻŋāϧāĻž
- Lost update āĻŦāĻž dirty write āĻĒā§āϰāϤāĻŋāϰā§āϧ āĻšā§āĨ¤
- āĻā§āϰāĻŋāĻāĻŋāĻā§āϝāĻžāϞ āĻĄā§āĻāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϰ āĻā§āώā§āϤā§āϰ⧠āύāĻŋāϰāĻžāĻĒāĻĻāĨ¤
â ī¸ āĻ āϏā§āĻŦāĻŋāϧāĻž
- āĻŦā§āϞāĻāĻŋāĻ āĻ āĻĄā§āĻĄāϞāĻ āĻā§āĻāĻāĻŋāĨ¤
- āĻĻā§āϰā§āĻ āĻā§āϰāĻžāύā§āϏā§āϝāĻžāĻāĻļāύ āϰāĻžāĻāϞ⧠āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏ āĻāĻŽā§ āϝāĻžā§āĨ¤
âī¸ āϤā§āϞāύāĻžāĻŽā§āϞāĻ āϏāĻžāϰāĻžāĻāĻļ
| āĻĻāĻŋāĻ | Optimistic Locking | Pessimistic Locking |
|---|---|---|
| āϧāĻžāϰāĻŖāĻž | āϏāĻāĻāϰā§āώ āĻšāĻŦā§ āύāĻž āϧāϰ⧠āύā§ā§ | āϏāĻāĻāϰā§āώ āĻĒā§āϰāĻžā§āĻ āĻšāĻŦā§ āϧāϰ⧠āύā§ā§ |
| āϞāĻ āϏāĻŽā§ | āĻāĻĒāĻĄā§āĻā§āϰ āϏāĻŽā§ āĻā§āĻ āĻāϰ⧠| āϰāĻŋāĻĄā§āϰ āϏāĻŽā§ā§āĻ āϞāĻ āϧāϰ⧠|
| āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏ | āĻĻā§āϰā§āϤ, āĻŦā§āĻļāĻŋ concurrent | āϧā§āϰ, āĻāĻŽ concurrent |
| āĻā§āĻāĻāĻŋ | conflict āĻšāϞ⧠retry āĻĻāϰāĻāĻžāϰ | deadlock/bloc āĻšāϤ⧠āĻĒāĻžāϰ⧠|
| āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻā§āώā§āϤā§āϰ | āϏāĻžāϧāĻžāϰāĻŖ CRUD, āĻāĻŽ āĻāύāĻĢā§āϞāĻŋāĻā§āĻ | āĻŦā§āϝāĻžāĻāĻāĻŋāĻ, āĻŦā§āĻāĻŋāĻ, critical update |
đ§Š āĻāĻāύ āĻā§āύāĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ
| āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋ | āĻĒā§āϰāϏā§āϤāĻžāĻŦāĻŋāϤ āĻĒāĻĻā§āϧāϤāĻŋ |
|---|---|
| Read-heavy API (āĻāĻŽ āĻāύāĻĢā§āϞāĻŋāĻā§āĻ) | Optimistic |
| Stock decrement, Money transfer, Admission bed allocation | Pessimistic |
| Multiple concurrent form edits | Optimistic |
| Critical transactional consistency (Finance, Pharmacy billing) | Pessimistic |
đ āĻāĻĒāϏāĻāĻšāĻžāϰ
- Optimistic Locking â āĻšāĻžāϞāĻāĻž āĻāύāĻĢā§āϞāĻŋāĻā§āĻā§ āĻĻā§āϰā§āϤ āĻ āϏā§āĻā§āϞā§āĻŦāϞāĨ¤
- Pessimistic Locking â āĻĄā§āĻāĻž āĻāύā§āĻāĻŋāĻā§āϰāĻŋāĻāĻŋ āϝā§āĻāĻžāύ⧠āϏāĻŦāĻā§ā§ā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤
- PostgreSQL āĻāĻā§ āĻā§āĻļāϞāĻ āĻļāĻā§āϤāĻāĻžāĻŦā§ āϏāĻžāĻĒā§āϰā§āĻ āĻāϰā§āĨ¤ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻĒā§āϰāĻā§āϤāĻŋ āĻ āύā§āϝāĻžā§ā§ āĻŦā§āĻā§ āύāĻŋāύ â performance āύāĻž consistency, āĻā§āύāĻāĻž āĻŦā§āĻļāĻŋ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āϤāĻž āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰā§āύāĨ¤