[PostgreSQL] advisory lock

PostgreSQL์€ ์—„๊ฒฉํ•œ ๋ฐฐํƒ€์„ฑ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๋ฐฐํƒ€์  Lock ๊ธฐ๋Šฅ์„ ๋‚ด์žฅํ•จ์ˆ˜๋กœ ์ œ๊ณตํ•œ๋‹ค.
๊ธฐ๋Šฅ์š”์†Œ๊ฐ€ ๊ทธ๋‹ค์ง€ ํ’๋ถ€ํ•˜์ง„ ์•Š์ง€๋งŒ, ๊ฐ€๋ฒผ์šด ์‚ฌ์šฉ์‚ฌ๋ก€์—์„œ๋Š” ๊ฝค ์“ธ๋งŒํ•  ์ˆ˜ ์žˆ๋‹ค.



์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ๊ทธ๋‹ค์ง€ ๋ณต์žกํ•˜์ง€ ์•Š๋‹ค.
์ „์šฉ ํ•จ์ˆ˜์ธ pg_advisory_lock์— lock ID๋ฅผ ๋„˜๊ฒจ์„œ ํ˜ธ์ถœํ•˜๋ฉด ๊ทธ๋งŒ์ด๋‹ค.

select pg_advisory_lock(N);

์—ฌ๊ธฐ์„œ lock ID๋Š” ํ•ญ์ƒ ์ •์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.
ํ•ด๋‹น ID๋กœ Lock์„ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์„ธ์…˜์ด ์žˆ๋‹ค๋ฉด ๊ธฐ๋‹ค๋ฆฌ๊ณ , ์—†๋‹ค๋ฉด Lock์„ ์ ์œ ํ•˜๊ณ  ๋นˆ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์œ ์˜ํ•  ์ ์ด ์ข€ ์žˆ๋Š”๋ฐ, ์ด๊ฑด ์„ธ์…˜ ๋‹จ์œ„๋กœ๋งŒ ๋ฐฐํƒ€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋‹ค!

์•„๋ฌดํŠผ lock์ด ์žกํžŒ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์„ธ์…˜์ด lock์„ ์‹œ๋„ํ•˜๋ฉด

์›๋ž˜ lock์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๋ฌดํ•œ ๋Œ€๊ธฐ์— ๋น ์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  Lock์„ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์€ unlock ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

select pg_advisory_unlock(N);

์œ ์˜ํ•  ์ ์€, lock์„ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์„ธ์…˜์—์„œ๋งŒ unlock์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ์„ธ์…˜์ด ๊ฐ€๋กœ์ฑ„์„œ ๋‚ ๋ฆฌ๋Š”๊ฑด ์•ˆ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ , Lock์„ ์ ์œ ํ•˜๋˜ ์„ธ์…˜์ด ๋‹ซํžˆ๋ฉด Lock์€ ์ž๋™์œผ๋กœ ํ•ด์ œ๋œ๋‹ค. ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋ฌดํ•œ๋Œ€๋กœ ๋‚จ์•„์žˆ์„ ์ผ์€ ์—†๋‹ค.




TTL ์ฒ˜๋ฆฌ

advisory lock์—๋Š” Lock์— ๋Œ€ํ•œ TTL ์ฒ˜๋ฆฌ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง„ ์•Š๋Š”๋‹ค. ๋งˆ์Œ๋Œ€๋กœ Lock์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜๋„ ์—†๋‹ค. Lock์— ๋Œ€ํ•œ ์†Œ์œ ๊ถŒ์ด ํ•ด๋‹น ์„ธ์…˜์—๊ฒŒ ์˜ค๋กฏ์ด ์กด์žฌํ•˜๋Š” ๊ตฌ์กฐ๋‹ค.

๊ทธ๋ž˜๋„ Lock์„ ์ ์œ ํ•˜์ง€๋Š” ๋ชปํ•˜์ง€๋งŒ, TTL์„ ๋А์Šจํ•˜๊ฒŒ๋‚˜๋งˆ ๊ตฌํ˜„ํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.
๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์€ ๊ทธ๋ƒฅ ํƒ€์ž„์•„์›ƒ์„ ์ ๋‹นํžˆ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
์ฟผ๋ฆฌ ์ˆ˜์ค€์—์„œ ํƒ€์ž„์•„์›ƒ์„ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์—์„œ ์„ค์ •ํ•ด๋„ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋ฌดํ•œ ๋Œ€๊ธฐ์— ๋น ์ง€์ง€ ์•Š๊ณ  ์ ๋‹นํžˆ ์˜ค๋ฅ˜์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ๋„ Lock์„ ์ ์œ ํ•˜์ง€ ๋ชปํ•˜๋‹ˆ ๋ญ”๊ฐ€ ๊ณ„์† ๊ผฌ์ผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ, ์ตœ์†Œํ•œ์˜ ์กฐ์น˜๋Š” ํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.




์ •์ˆ˜ Lock ID

advisory lock์˜ ๋‹จ์  ์ค‘ ํ•˜๋‚˜๋Š”, ๋ฌธ์ž์—ด์„ ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ ์›๋ณธ ๋ฆฌ์†Œ์Šค ๋‹จ์œ„ ์‹๋ณ„์ž๊ฐ€ ๋ฌธ์ž์—ด์ผ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๊ฑธ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฒˆ์žก์Šค๋Ÿฐ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ณ  ์‰ฌ์šด ๋ฐฉ๋ฒ•์€, hashtext ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๋ฌธ์ž์—ด์„ ์ •์ˆ˜ ํ•ด์‹œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ๋„ ๋ฌผ๋ก  ํ•ด์‹œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ ๋“ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๊ธด ํ•œ๋‹ค.



์ฐธ์กฐ
https://www.postgresql.org/docs/current/explicit-locking.html#ADVISORY-LOCKS
https://stackoverflow.com/questions/29353845/how-do-i-use-string-as-a-key-to-postgresql-advisory-lock