[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