Skip to Content
Go Realm v1 is released 🎉
DatabaseLocking

🔒 Locking (āϞāĻ•āĻŋāĻ‚)

āĻĄā§‡āϟāĻžāĻŦ⧇āϏ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āχāωāϜāĻžāϰ/āĻĒā§āϰāϏ⧇āϏ āĻāĻ•āχ āĻĄā§‡āϟāĻž āĻāĻ•āϏāĻžāĻĨ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āϚāĻžāχāϞ⧇ āϏāĻ‚āϘāĻ°ā§āώ (conflict) āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāχ concurrency āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻžāĻŽāϞāĻžāϤ⧇ āĻĻ⧁āϟāĻŋ āϜāύāĻĒā§āϰāĻŋ⧟ āĻ•ā§ŒāĻļāϞ āĻšāϞ⧋:

  • Optimistic Locking (āφāĻļāĻžāĻŦāĻžāĻĻā§€ āϞāĻ•āĻŋāĻ‚)
  • Pessimistic Locking (āύāĻŋāϰāĻžāĻļāĻžāĻŦāĻžāĻĻā§€ āϞāĻ•āĻŋāĻ‚)

āύāĻŋāĻšā§‡ āωāĻ­ā§Ÿā§‡āϰ āϧāĻžāϰāĻŖāĻž, āĻ•āĻžāĻœā§‡āϰ āϧāĻžāĻĒ, PostgreSQL āωāĻĻāĻžāĻšāϰāĻŖ, āĻ“ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻĒā§āĻ°ā§Ÿā§‹āĻ— āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāϞ⧋āĨ¤


🧠 Optimistic Locking (āφāĻļāĻžāĻŦāĻžāĻĻā§€ āϞāĻ•āĻŋāĻ‚)

🔍 āϧāĻžāϰāĻŖāĻž

Optimistic Locking āϧāϰ⧇ āĻ¨ā§‡ā§Ÿ āϝ⧇ āĻāĻ•āχ āĻĄā§‡āϟāĻžā§Ÿ āĻāĻ•āϏāĻžāĻĨ⧇ āφāĻĒāĻĄā§‡āĻŸā§‡āϰ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āĻ•āĻŽāĨ¤ āϤāĻžāχ āĻļ⧁āϰ⧁āϤ⧇ āϕ⧋āύ⧋ āϞāĻ• āϧāϰāĻž āĻšā§Ÿ āύāĻž — āĻŦāϰāĻ‚ āφāĻĒāĻĄā§‡āĻŸā§‡āϰ āϏāĻŽā§Ÿ āĻĻ⧇āĻ–āĻž āĻšā§Ÿ āĻĄā§‡āϟāĻž āφāϗ⧇āϰ āĻŽāϤ⧋ āφāϛ⧇ āĻ•āĻŋ āύāĻžāĨ¤ āϝāĻĻāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšā§Ÿā§‡ āϝāĻžā§Ÿ, āϤāĻžāĻšāϞ⧇ āφāĻĒāĻĄā§‡āϟ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāĻŦ⧇ (conflict)āĨ¤

âš™ī¸ āĻ•āĻžāĻœā§‡āϰ āϧāĻžāĻĒ

  1. āĻŸā§‡āĻŦāĻŋāϞ⧇ āĻāĻ•āϟāĻŋ version āĻŦāĻž updated_at āĻ•āϞāĻžāĻŽ āϰāĻžāĻ–āĻž āĻšā§ŸāĨ¤
  2. āĻĄā§‡āϟāĻž āϰāĻŋāĻĄ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āϏ⧇āχ version āύ⧋āϟ āĻ•āϰāĻž āĻšā§ŸāĨ¤
  3. āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āĻļāĻ°ā§āϤ⧇ (WHERE id = ? AND version = ?) āĻŽāĻŋāϞāĻŋā§Ÿā§‡ āĻĻ⧇āĻ–āĻž āĻšā§ŸāĨ¤
  4. āϝāĻĻāĻŋ āĻ…āĻ¨ā§āϝ āϕ⧇āω āĻāϰ āĻŽāĻ§ā§āϝ⧇ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧇, āϤāĻžāĻšāϞ⧇ āϕ⧋āύ⧋ āϰ⧋ āφāĻĒāĻĄā§‡āϟ āĻšāĻŦ⧇ āύāĻž (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 (āύāĻŋāϰāĻžāĻļāĻžāĻŦāĻžāĻĻā§€ āϞāĻ•āĻŋāĻ‚)

🔍 āϧāĻžāϰāĻŖāĻž

āϧāϰ⧇ āĻ¨ā§‡ā§ŸāĻž āĻšā§Ÿ, āĻāĻ•āχ āĻĄā§‡āϟāĻžā§Ÿ āĻāĻ•āϏāĻžāĻĨ⧇ āφāĻĒāĻĄā§‡āϟ āĻšāĻ“ā§ŸāĻžāϰ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āĻŦ⧇āĻļāĻŋāĨ¤ āϤāĻžāχ āĻĄā§‡āϟāĻž āϰāĻŋāĻĄ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿāχ āϞāĻ• āϧāϰāĻž āĻšā§Ÿ, āϝāĻžāϤ⧇ āĻ…āĻ¨ā§āϝ āϕ⧇āω āφāĻĒāĻĄā§‡āϟ āύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

âš™ī¸ āĻ•āĻžāĻœā§‡āϰ āϧāĻžāĻĒ

  1. āĻŸā§āϰāĻžāĻ¨ā§āĻ¸ā§āϝāĻžāĻ•āĻļāύ āĻļ⧁āϰ⧁ āĻšā§ŸāĨ¤
  2. SELECT āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ FOR UPDATE āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāĨ¤
  3. āĻŸā§āϰāĻžāĻ¨ā§āĻ¸ā§āϝāĻžāĻ•āĻļāύ āĻļ⧇āώ āύāĻž āĻšāĻ“ā§ŸāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻ…āĻ¨ā§āϝ 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 LockingPessimistic Locking
āϧāĻžāϰāĻŖāĻžāϏāĻ‚āϘāĻ°ā§āώ āĻšāĻŦ⧇ āύāĻž āϧāϰ⧇ āĻ¨ā§‡ā§ŸāϏāĻ‚āϘāĻ°ā§āώ āĻĒā§āϰāĻžā§Ÿāχ āĻšāĻŦ⧇ āϧāϰ⧇ āĻ¨ā§‡ā§Ÿ
āϞāĻ• āϏāĻŽā§ŸāφāĻĒāĻĄā§‡āĻŸā§‡āϰ āϏāĻŽā§Ÿ āĻšā§‡āĻ• āĻ•āϰ⧇āϰāĻŋāĻĄā§‡āϰ āϏāĻŽā§Ÿā§‡āχ āϞāĻ• āϧāϰ⧇
āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏāĻĻā§āϰ⧁āϤ, āĻŦ⧇āĻļāĻŋ concurrentāϧ⧀āϰ, āĻ•āĻŽ concurrent
āĻā§āρāĻ•āĻŋconflict āĻšāϞ⧇ retry āĻĻāϰāĻ•āĻžāϰdeadlock/bloc āĻšāϤ⧇ āĻĒāĻžāϰ⧇
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰāϏāĻžāϧāĻžāϰāĻŖ CRUD, āĻ•āĻŽ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟāĻŦā§āϝāĻžāĻ‚āĻ•āĻŋāĻ‚, āĻŦ⧁āĻ•āĻŋāĻ‚, critical update

🧩 āĻ•āĻ–āύ āϕ⧋āύāϟāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ

āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāĻĒā§āϰāĻ¸ā§āϤāĻžāĻŦāĻŋāϤ āĻĒāĻĻā§āϧāϤāĻŋ
Read-heavy API (āĻ•āĻŽ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ)Optimistic
Stock decrement, Money transfer, Admission bed allocationPessimistic
Multiple concurrent form editsOptimistic
Critical transactional consistency (Finance, Pharmacy billing)Pessimistic

🏁 āωāĻĒāϏāĻ‚āĻšāĻžāϰ

  • Optimistic Locking → āĻšāĻžāϞāĻ•āĻž āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āĻŸā§‡ āĻĻā§āϰ⧁āϤ āĻ“ āĻ¸ā§āϕ⧇āϞ⧇āĻŦāϞāĨ¤
  • Pessimistic Locking → āĻĄā§‡āϟāĻž āχāĻ¨ā§āϟāĻŋāĻ—ā§āϰāĻŋāϟāĻŋ āϝ⧇āĻ–āĻžāύ⧇ āϏāĻŦāĻšā§‡ā§Ÿā§‡ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤
  • PostgreSQL āωāϭ⧟ āĻ•ā§ŒāĻļāϞāχ āĻļāĻ•ā§āϤāĻ­āĻžāĻŦ⧇ āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰ⧇āĨ¤ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻĒā§āϰāĻ•ā§ƒāϤāĻŋ āĻ…āύ⧁āϝāĻžā§Ÿā§€ āĻŦ⧇āϛ⧇ āύāĻŋāύ — performance āύāĻž consistency, āϕ⧋āύāϟāĻž āĻŦ⧇āĻļāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āϤāĻž āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύāĨ¤