ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ์ ์ํด ์ด๋ค Lock์ ์ฌ์ฉํด์ผ ํ ๊น? - (2) DB Lock์ Shared Lock, Exclusive Lock Deep Dive ๐
junojuno 2024. 3. 2. 21:35๐ Overview
Shared Lock๊ณผ Exclusive Lock์ S-Lock, X-Lock์ด๋ผ๊ณ ๋ ํ๋ฉฐ, (์ฝ๊ธฐ ๋ฝ, ์ฐ๊ธฐ ๋ฝ), (๊ณต์ ๋ฝ, ๋ฐฐํ ๋ฝ)์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
ํ์ง๋ง ์ด lock์ ๋ํ ๋ด์ฉ์ ํ์ตํ๋ฉด์ ์ฌ๋ฌ ๋ธ๋ก๊ทธ๋ค์ ์ฐพ์๋ดค๋๋ฐ, ์๋ชป๋ ๋ด์ฉ๋ค์ด ์ ๋ง ๋ง์๋ค!
๊ทธ๋์ ๊ทธ ๋ด์ฉ๋ค์ ์ค์ ๋ด๊ฐ MySQL ์ฟผ๋ฆฌ๋ฅผ ํตํด ๋น๊ตํ๋ฉด์ ๋ฐ๋ก์ก๊ณ , ํํค์ณ ๋ณด๊ธฐ ์ํด์ ๊ธ์ ์จ์ผ๊ฒ ๋ค๋ ๊ฒฐ์ฌ์ ํ๋ค.
๐Shared Lock๊ณผ Exclusive Lock
๋จผ์ ์ ๊ธ์์๋ ์ธ๊ธํ์ง๋ง, InnoDB ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ์์์ Lock์ ์ค๋ช ํ๋ฉด์ Shared Lock, Exclusive Lock์ ๊ฐ๋ ์ด ๋์๋ค.
ํน์ row์ lock์ ๊ฑธ๋ฉด ๋ ์ฝ๋๋ฝ, ์ฌ๋ฌ row์ range๋ก lock์ ๊ฑธ๋ฉด ๋ฅ์คํฌ ํค ๋ฝ, ๊ทธ๋ฆฌ๊ณ ๊ทธ row๋ค ์ค๊ฐ์ ๊ฑธ๋ฆฌ๋ ๊ฐญ ๋ฝ ์ด ์์๋ค.
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ์ ๊ณตํ๋ ๋ฝ์ ์ทจ๋ํ๋ ๋ฐฉ๋ฒ์๋ 1๏ธโฃ UPDATE ์ฟผ๋ฆฌ, 2๏ธโฃ DELETE ์ฟผ๋ฆฌ, 3๏ธโฃ Shared Lock / Exclusive Lock ํ๋ ์์ ๋ฐ์ํ๋ค๊ณ ์ธ๊ธํ์๋ค.
๊ทธ ์ค, Shared Lock๊ณผ Exclusive Lock์ ๋ํด์ ์์๋ณด์.
1. Shared Lock (๊ณต์ ๋ฝ)
Shared Lock์ MySQL 8.0 ๋ฒ์ ๋ถํฐ SELECT .. FOR SHARE ์ ํตํด ํ๋ํ ์ ์๋ค.
Shared Lock์ ์ฝ๊ธฐ ์ ๊ธ์ด๋ผ๊ณ ๋งํ๋ค. ๊ทธ๋์ ๋ฆฌ์์ค๋ฅผ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋ ์ฝ๋๋ฅผ ์ฝ์ ์๋ ์์ง๋ง, ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ํ๋ ๊ฒ์ ์ฐจ๋จํ๋ค๊ณ ์ฌ๋ฌ ๋ธ๋ก๊ทธ๋ค์์ ๋งํ๋ค.
ํ์ง๋ง Exclusive Lock์์๋ ๋์ผํ๊ฒ ๋ฆฌ์์ค๋ฅผ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋ ์ฝ๋๋ฅผ ์ฝ์ ์๋ ์์ง๋ง, ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ฐจ๋จํ๋ค.
๋ฟ๋ง ์๋๋ผ, shared, exclusive lock์ด ์๋ update, delete ์ฟผ๋ฆฌ์์๋ ๋์ผํ๊ฒ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ฐจ๋จํ๋ค.
๋ฌด์จ๋ง์ด๋๋ฉด, ์ฌ์๋ฒํธ๊ฐ 10001๋ฒ์ด๊ณ ์ฐ๋ด์ด 60117์ธ row์ ๋ ์ฝ๋ ๋ฝ, ๊ทธ ์ค shared lock์ ํ ํธ๋์ญ์ ๋ด์์ ๊ฑธ์๋ค. (์์๋ ์ ๋ฌด์ ๋ฐ๋ก์ฐ๋ SQL ํ๋ ์ฑ ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค)
autocommit์ ๋๊ณ , ํธ๋์ญ์ ์ ์์ํ๋ค. ๊ทธ๋ฆฌ๊ณ shared lock์ for share ํค์๋๋ฅผ ํตํด ํ๋ํ๋ค.
shared lock์ ์์์ ์ป๊ณ , ๋ค๋ฅธ ์ฐฝ์ ์ด์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ํด๋น row๋ฅผ updateํด ๋ณด์๋ค.
๊ทธ๋ฌ๋ ๋ฌดํ ๋๊ธฐ ์ํ์ ๋น ์ก๋ค. spin lockํํ๋ก ๊ณ์ ์๋ํ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฌ๊ณ transaction 1๋ฒ์์ rollback ์์ผฐ๋๋, ๋๊ธฐ์ค์ด๋ transaction 2๋ฒ์์ update ์ฟผ๋ฆฌ๊ฐ ์ ์ ์คํ๋์๋ค.
๊ทธ๋ฆฌ๊ณ SHOW PROCESSLIST;๋ก ๋ค๋ฅธ ์ฐฝ์ ํ๋ ๋ ์ด์ด ํ๋ก์ธ์ค๊ฐ ์ด๋ค ์ํ์ธ์ง ๋น๊ต๋ฅผ ํด ๋ณด์๋ค.
๋จผ์ Transaction 1๋ฒ์ด rollback์ ํตํด lock ๋ฐํ ์ ๋ชจ์ต์ด๋ค.
Id๊ฐ 77๋ฒ์ธ ํ๋ก์ธ์ค์์ update ์ฟผ๋ฆฌ๋ฅผ ๊ณ์ํด์ ์คํํ๊ณ ์๋ค.
์๋๋ Transaction 1๋ฒ์ด rollback ํ lock์ ๋ฐํ ํ๊ณ ๋ ๋ชจ์ต์ด๋ค.
Id๊ฐ 77๋ฒ์ธ ํ๋ก์ธ์ค์์ update๋ฅผ ๋ง์น๊ณ state๊ฐ ๋ฐ๋์๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ lock์ ํ๋ํ๊ณ ๋ค๋ฅธ ํธ๋์ญ์ ์์ update ์ฟผ๋ฆฌ ์คํ ์ ๋๊ธฐํ๋ ํ์์ shared lock, exclusive lock์ด ์๋ update๋ delete์์๋ ๋์ผํ๋ค.
์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด, ๊ฒฐ๊ตญ transaction 1๋ฒ์ด rollback์ ํ๊ณ ๋์์ผ 16์ด ๋ง์ delete ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ด๊ฑด
๋์์ ๋ ์ฝ๋๋ฅผ ์ฝ์ ์๋ ์์ง๋ง, ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ํ๋ ๊ฒ์ ์ฐจ๋จํ๋ ๊ฒ์ด shared lock์ ํน์ง์ด๋ผ๊ณ ๋์ค๋๋ฐ, ์ด๋ shared lock์์์ ํน์ง์ด๋ผ๊ธฐ ๋ณด๋ค๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง ์์์ ํน์ row์ ๋ ์ฝ๋๋ฝ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์๋ค.
๋ฐ๋ผ์ ๊ฐ์ธ์ ์ผ๋ก shared lock์ ๋ํด์ ํ์ตํ๋ค ํท๊ฐ๋ฆฐ ๋ถ๋ถ์ด ์๋ ๋ถ๋ถ์ธ๋ฐ, ํน์ row์ ๋ํด์ shared lock์ ์ป์ ํธ๋์ญ์ ๋ด์์ update๋ฅผ ํตํ row์ ๋ํ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค! shared lock์ด๋ผ๊ณ ๋ฌด์กฐ๊ฑด lock์ด ๊ฑธ๋ฆฐ row์ ๋ํด ์ฐ๊ธฐ์์ ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ์๋๋ผ, ๋์ผํ ํธ๋์ญ์ ์ด๋ฉด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋ฉด Shard Lock์ ์ง์ง ํน์ง์ ๋ญ๊น?
์๋์์ ๋ณผ ์ ์๋ฏ, ํ ํธ๋์ญ์ ์์ ๊ณต์ ๋ฝ์ ํ๋ํ๋ฉด, ํด๋น ํธ๋์ญ์ ์ด ์ปค๋ฐ / ๋กค๋ฐฑ์ ํตํด ๋ฝ์ ๋ฐํํ ๋ ๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ํ๋ ํ ์ ์๋ ๋ฝ์ ๋งํ๋ค. ๋จ, ๋ฐฐํ ๋ฝ์ ํ๋ ๋ถ๊ฐ๋ฅ ํ๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ฐฐํ ๋ฝ ์ ํ๋ํ๋ ค ํ๋ฉด ๋๊ธฐ ์ํ์ ๋น ์ง๋ค.
2) Exclusive Lock (๋ฐฐํ ๋ฝ)
Exclusive Lock์ ์ด๋ฏธ ๋์์ง๋ง SELECT .. FOR UPDATE ์ ํตํด ํ๋ํ ์ ์๋ค.
๋ฐฐํ ๋ฝ์ ํน์ง ๋ํ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ณ ์์๋๋ฐ, ์ด๋ ์๋ชป๋์๋ค๊ณ ์๊ฐํ๋ค.
์ Transaction 1๋ฒ์์ ๋ฐฐํ๋ฝ์ ํ๋ํ๋ฉด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝ๊ธฐ๊ฐ ์๋ ๊ฒ ๊ฐ์ง๋ง ์๋์ ๊ฐ์ด ๊ฐ๋ฅํ๋ค.
์์ ๊ฐ์ select ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๋๊ธฐ ์ํ์ ๋น ์ง๊ฒ ๊ฐ์์ง๋ง ๋ฐ๋ก ์กฐํ๊ฐ ๋์๋ค.
์๊ทธ๋ด๊น?๐ค
๋ฐฐํ๋ฝ์ ํน์ง์ ์๋ชป ์ดํดํ๊ณ ์์ด์ ์์ ๊ฐ์ ์คํด๋ฅผ ํ๋๋ฐ,
๋ฐฐํ๋ฝ์ ํน์ง์ ํ ํธ๋์ญ์ ์์ ๋ฐฐํ๋ฝ์ ํ๋ํ๋ฉด ์ปค๋ฐ or ๋กค๋ฐฑ์ ํตํด ๋ฐฐํ๋ฝ์ ๋ฐ๋ฉํ๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ฐฐํ๋ฝ AND ๊ณต์ ๋ฝ ์ ์ทจ๋ ํ ์ ์๋ค.
๋ฐฐํ๋ฝ์ Transaction 2๋ฒ์์ ํ๋ ํ๋ ค๊ณ ํ๋ฉด ๋๊ธฐ์ํ์ ๋น ์ง๋ค. (Transaction 1๋ฒ์ด ๋ฐฐํ๋ฝ์ ์ปค๋ฐ / ๋กค๋ฐฑ์ ํตํด ๋ฐ๋ฉํด์ผ ํ๋ํ๋ค)
์ด๋๋ Transaction 2๋ฒ์์ ๊ณต์ ๋ฝ์ ํ๋ ํ๋ ค๊ณ ํด๋ ๋๊ธฐ์ํ์ ๋น ์ง๋ค
์ ๋ฆฌํ์๋ฉด, ๊ณต์ ๋ฝ์ ํ ํธ๋์ญ์ ์์ ํ๋ ์, ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ํ๋ ๊ฐ๋ฅํ๋ค. ์ด๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ฐฐํ๋ฝ์ ํ๋์ ๋ง๊ณ , ๋ค๋ฅธ ํธ๋์ญ์ ์์์ update, delete ์ฟผ๋ฆฌ ์คํ์ ๋ง๋๋ค.
๋ฐฐํ ๋ฝ์ ํ ํธ๋์ญ์ ์์ ํ๋ ์, ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๊ณต์ ๋ฝ, ๋ฐฐํ๋ฝ ํ๋ ๋ชจ๋๋ฅผ ๋ง๋๋ค. ์ด๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์์ updaet, delete ์ฟผ๋ฆฌ ์คํ์ ๋ง๋๋ค.
ํ๊ธฐ
๋ณดํต ํ๊ธฐ๋ฅผ ์ ์ฐ์ง๋ ์๋๋ฐ, ์ฌ๋ฌ ๋ธ๋ก๊ทธ๋ฅผ ํตํด ํ์ต์ ํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ์ง์ ์ค์ต์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด๋ ๊ณผ์ ๋ ์ค์ํ๊ตฌ๋..! ๋ผ๋ ๊ฒ์ ๋๊ผ๋ค.
์ง์ sql ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด๋ฉด์, ๊ธฐ์กด์ ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์๊ฐ๋ค,
- shared lock == ์ฝ๊ธฐ ๋ฝ -> ๋ค๋ฅธ ๊ณณ์์ ์ฝ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ณ ์ฐ๋ ๊ฒ๋ง ๋ง๋ ๊ตฌ๋
- exclusive lock == ์ฐ๊ธฐ ๋ฝ -> ๋ค๋ฅธ ๊ณณ์์ ์ฝ๋ ๊ฒ๋ ์๋๊ณ ์ฐ๋๊ฒ๋ ์๋๊ตฌ๋
๋ผ๋ ์๋ชป๋ ์ธ์์์ ํด๋ฐฉ์์ผ ์ฃผ์๋ค.
[Lock ์๋ฆฌ์ฆ]
๋์์ฑ ์ ์ด๋ฅผ ์ํ Lock (1) - DB Lock
๋์์ฑ ์ ์ด๋ฅผ ์ํ Lock (2) - Shard Lock, Exclusive Lock Deep Dive
Reference
Real MySQL 8.0 Chapter 5
'Programming > Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday