[PostgreSQL] Lock

lock์€ ๋™์‹œ์„ฑ ์ œ์–ด์—์„œ, ๋™์‹œ์— ์–ด๋–ค ํ•ญ๋ชฉ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ• ๋•Œ ์–ด๋–ป๊ฒŒ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ํ—ˆ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.



ํ…Œ์ด๋ธ” Lock ๊ฑธ๊ธฐ

์ด๊ฒŒ ์™œ ํ•„์š”ํ•˜๊ณ , ์–ด๋–จ๋•Œ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ถ€ํ„ฐ ์‚ฌ์šฉ์‚ฌ๋ก€๋ฅผ ํ•œ๋ฒˆ ๊ฐ„๋žตํ•˜๊ฒŒ ๋ณด๊ฒ ๋‹ค.

๋งŒ์•ฝ ๋ฐ์ดํ„ฐ ํ’€์„ ๊ด€๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ํ•˜๋‚˜ ์žˆ๊ณ ,

์–ด๋–ค ์„œ๋ฒ„์—์„œ ์ด๊ฑธ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.
๊บผ๋‚ด์“ฐ๊ณ  ๋‚˜์„œ๋Š” used์— true๊ฐ’์„ ์ƒˆ๊ฒจ์ฃผ๊ณ , ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ์š”์ฒญ์—์„œ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์•„๋ฌด ์ƒ๊ฐ์—†์ด ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์“ฐ๋Š” ๊ฒƒ์€ ๋ฌธ์ œ์˜ ์†Œ์ง€๊ฐ€ ๋งŽ๋‹ค.

๋ฌด์ž‘์ • used๊ฐ€ false์ธ ๊ฒƒ๋“ค์„ ๊ฐ€์ ธ์˜ค๋‹ค๋ณด๋‹ˆ, ์—ฌ๋Ÿฌ๊ฐœ์˜ ์š”์ฒญ์—์„œ ๋™์‹œ์— ๋™์ผํ•œ pool ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ๋™์ผํ•œ pool ๋ฐ์ดํ„ฐ์— used true๋ฅผ ์ƒˆ๊ธธ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Ÿฌ๋ฉด ๊ทธ๋ƒฅ..

9๊ฐœ๊ฐ€ ๋ฐ์ดํ„ฐ ํ–‰ ํ•˜๋‚˜๋งŒ ์“ฐ๊ณ  ๋งŒ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์— ํ•„์š”ํ•œ ๊ฒƒ์ด Lock์ด๋‹ค.
table lock์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ ‘๊ทผ์„ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

lock table ํ…Œ์ด๋ธ”๋ช…;

ํ•ญ์ƒ ํŠธ๋žœ๋ฐฑ์…˜ ๊ตฌ๋ฌธ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š”์  ์žˆ์ง€ ๋ง์ž.

์ด๋ ‡๊ฒŒ ํ–ˆ๋‹ค๋ฉด ์ด์ œ

์ˆœ์ฐจ์ ์œผ๋กœ ์ž˜ ์ ‘๊ทผ์ด ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค.




ํ–‰ ๋‹จ์œ„ lock

๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค, ์ € ํ–‰ ํ•˜๋‚˜์”ฉ ์จ๋จน๋Š”๋ฐ ํ•œ ์ฟผ๋ฆฌ ๋Œ๋•Œ๋งˆ๋‹ค ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ lockํ•ด๋ฒ„๋ฆฌ๋Š”๊ฑด ๋‹ค์†Œ ๋‚ญ๋น„์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
์‚ฌ์‹ค, ๊ฐ™์€ ํ–‰์— ๋™์‹œ์ ‘๊ทผ๋งŒ ํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ํ–‰์€ ์ ‘๊ทผํ•ด๋„ ๋˜๋Š”๊ฒŒ ์•„๋‹Œ๊ฐ€?

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ผ€์ด์Šค์—๋Š” ํ–‰ ๋‹จ์œ„ lock์„ ๊ฑฐ๋Š” ํŽธ์ด ๋ณด๋‹ค ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.
๋Œ€๋žต์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ์ด๋ ‡๋‹ค.

... ์ฟผ๋ฆฌ ... for update

์ด๋Ÿฌ๋ฉด ์ € ์กฐ๊ฑด์— ์˜ํ•ด ๊ฐ€์ ธ์˜จ ํ•ญ๋ชฉ๋“ค์€ ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚  ๋•Œ๊นŒ์ง€ lock์ด ๊ฑธ๋ ค์„œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ด ์ผ€์ด์Šค์—์„œ๋Š” ์‚ฌ์‹ค ์ฒ˜์Œ ์ฟผ๋ฆฌ๋ฅผ ๋Œ๋ฆด๋•Œ๋Š” ์ „๋ถ€ ์ฒซ๋ฒˆ์งธ ํ–‰์„ ๊ฐ€๋ฆฌ์ผœ์„œ ์‹ค์ œ ๋™์ž‘์€ ๋‹ค๋ฅด์ง€ ์•Š๊ฒ ์ง€๋งŒ, ๋‹ค๋ฅธ ์™ธ๋ถ€์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅธ ํ–‰๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋‹ฌ๋ผ์กŒ๋‹ค.




Lock์˜ ์ข…๋ฅ˜

๋ฝ ์ˆ˜์ค€์—๋Š” ๊ฝค๋‚˜ ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์žˆ๋‹ค.

lock table ํ…Œ์ด๋ธ”๋ช… [ IN lockmode MODE ];

์ด๊ฒƒ๋„ ๊ฝค ์ข…๋ฅ˜๊ฐ€ ๋งŽ๋‹ค.


1. ACCESS SHARE

๊ฐ€์žฅ ์‰ฌ์šด ์ˆ˜์ค€์˜ ๋ฝ์ด๋‹ค.
ACCESS EXCLUSIVE์™€๋งŒ ์ถฉ๋Œํ•˜๊ณ , ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์–ธ์ œ๋“  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ฝ๊ธฐ๋งŒ ํ•˜๊ณ  ํ…Œ์ด๋ธ”์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋Š” ์ด ๋ฝ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.


2. ROW SHARE

EXCLUSIVE, ACCESS EXCLUSIVE ๋ฝ๊ณผ ์ถฉ๋Œํ•œ๋‹ค.
for update ๊ฐ™์€ ํ–‰ ๋‹จ์œ„ lock์„ ๊ฑธ ๊ฒฝ์šฐ์— ์ด๊ฒŒ ๋ถ™๋Š”๋‹ค.


3. ROW EXCLUSIVE

SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE์™€ ์ถฉ๋Œํ•œ๋‹ค.
UPDATE, DELETE, INSERT ๋“ฑ์˜ ์ˆ˜์ • ์ฟผ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฑธ๋กœ ๋™์ž‘ํ•œ๋‹ค.


4. SHARE UPDATE EXCLUSIVE

SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE ๋ฝ๊ณผ ์ถฉ๋Œํ•œ๋‹ค.

VACUUM, ANALYZE, CREATE INDEX CONCURRENTLY, CREATE STATISTICS, COMMENT ON, REINDEX CONCURRENTLY, ์ผ๋ถ€ ALTER INDEX์— ์˜ํ•ด ํš๋“๋œ๋‹ค.


5. SHARE

ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE์™€ ์ถฉ๋Œ ํ•œ๋‹ค.
์ด ๋ชจ๋“œ๋Š” ๋™์‹œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ํ…Œ์ด๋ธ”์„ ๋ณดํ˜ธํ•œ๋‹ค.

CREATE INDEX ๋“ฑ์— ์˜ํ•ด ๋™์ž‘ํ•œ๋‹ค.


6. SHARE ROW EXCLUSIVE

ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE์™€ ์ถฉ๋Œํ•œ๋‹ค.

CREATE TRIGGER๋‚˜ ์ผ๋ถ€ ALTER TABLE ์ฟผ๋ฆฌ์— ๋ถ™๋Š”๋‹ค.


7. EXCLUSIVE

์ด๊ฒŒ ๋ฝ์„ ์žก๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ACCESS SHARE lock์„ ๋“ค๊ณ ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๊ทธ ์™ธ์—” ์ ‘๊ทผ์ด ๋ง‰ํžŒ๋‹ค.


8. ACCESS EXCLUSIVE

๊ฐ€์žฅ ๊ฐ•ํ•œ ์ˆ˜์ค€์˜ lock์œผ๋กœ, ๋ชจ๋“  ์ฝ๊ธฐ๋“  ์“ฐ๊ธฐ๋“  ๊ฐ„์— ๋™์‹œ์— ์ง€๊ธˆ ๋Œ๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜๋งŒ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๋ฝ ์ˆ˜์ค€์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  lock ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๊ฒŒ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ” ์ „์ฒด์— ๋งŽ์€ ์˜ํ–ฅ์„ ์ฃผ๋Š” alter index๋‚˜ alter table ์ฟผ๋ฆฌ์˜ ๊ธฐ๋ณธ ๋ฝ ์„ค์ •์ด ์ด๊ฑฐ๋‹ค.

์ข€๋” ์ดํ•ด๋ฅผ ๋•๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด๋†“์€ ํ‘œ๋‹ค.

์–ด๋–ค lock์ด ์–ด๋–ค lock์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ํ‘œํ˜„ํ•ด๋†จ๋‹ค.




์ฐธ์กฐ
https://stackoverflow.com/questions/47441027/pessimistic-locking-vs-serializable-transaction-isolation-level
https://stackoverflow.com/questions/22646226/how-are-locking-mechanisms-pessimistic-optimistic-related-to-database-transact
https://www.postgresql.org/docs/current/explicit-locking.html
https://www.postgresql.org/docs/current/sql-lock.html
https://brownbears.tistory.com/543