did_story
[Database] ๋์์ฑ ์ ์ด(Concurrency Control) - Locking ๋ณธ๋ฌธ
[Database] ๋์์ฑ ์ ์ด(Concurrency Control) - Locking
์ด์ ์์ 2025. 7. 15. 12:51์์ ๊ธ์ ์ฝ๊ณ ์จ ๋น์ , ๋์์ฑ ์ ์ด์ ๋ํด์ ์กฐ๊ธ์ ๋ฐฐ์๋ณด์์ ๊ฒ์ด๋ค. ์ด์ ๋ค์ ์ ์ด ๋ฐฉ๋ฒ์ธ Locking์ ๋ํด์ ๊ฐ์ด ์์๋ด ์๋ค~!
Locking
Locking์ ํ๋์ ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๋์, ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฝ์ง ๋ชปํ๋๋ก ์ ํํ๋ ๋ฉ์ปค๋์ฆ์ ์๋ฏธํฉ๋๋ค! ๊ทธ๋ผ ์ด๋ ๊ฒ ์ ํํ๋ ๋์์ ์ด๋ป๊ฒ ๋ ๊น์?!
1. Locking์ ๋์
โ Row-Level Lock (ํ ๋จ์ ์ ๊ธ)
- ์ ๋ฐํจ: ๋จ ํ ๊ฐ์ ๋ ์ฝ๋(ํ)์๋ง ์ ๊ธ์ ๊ฑฐ๋ ๋ฐฉ์.
- ๋์์ฑ ๋งค์ฐ ๋์: ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ฐ์ ํ ์ด๋ธ ๋ด ๋ค๋ฅธ ํ์ ๋ํด์๋ ์์ ๊ฐ๋ฅ.
- ์ฌ์ฉ ์์: MySQL InnoDB์ ๊ธฐ๋ณธ ์ ๊ธ ๋ฐฉ์.
- ๋จ์ : ์ ๊ธ ์๊ฐ ๋ง์์ง๋ฉด ๊ด๋ฆฌ ๋น์ฉ(์ค๋ฒํค๋) ์ฆ๊ฐ, ๋ณต์กํ ๋ฐ๋๋ฝ ๊ฐ๋ฅ์ฑ ์ฆ๊ฐ.
// ex
UPDATE employees SET salary = 5000 WHERE id = 101;
→ id = 101 ํ๋ง ์๊ธด๋ค.
โก Table-Level Lock (ํ ์ด๋ธ ์ ์ฒด ์ ๊ธ)
- ๋จ์ํจ: ํ ์ด๋ธ ์ ์ฒด๋ฅผ ํ ๋ฒ์ ์ ๊ทธ๋ ๋ฐฉ์
- ๋์์ฑ ๋ฎ์: ํ๋์ ํธ๋์ญ์ ์ด ํ ์ด๋ธ์ ์ฌ์ฉ ์ค์ด๋ฉด, ๋๋จธ์ง ํธ๋์ญ์ ์ ๋ชจ๋ ๋๊ธฐ
- ์ฌ์ฉ ์์: MyISAM ์์ง์์ ์ฃผ๋ก ์ฌ์ฉ
- ์ฅ์ : ๊ตฌํ ๋ฐ ๊ด๋ฆฌ๊ฐ ๋จ์, ๋ฐ๋๋ฝ ๊ฐ๋ฅ์ฑ ๊ฑฐ์ ์์
- ๋จ์ : ๋๊ท๋ชจ ๋ค์ค ์ฌ์ฉ์ ํ๊ฒฝ์์ ๋ณ๋ชฉ(Bottleneck)
// ex
LOCK TABLE employees WRITE;
→ employees ํ ์ด๋ธ ์ ์ฒด๊ฐ ๋ฐฐํ ์ ๊ธ
โข Page-Level Lock (ํ์ด์ง ๋จ์ ์ ๊ธ)
- ์ ์ถฉ์: ํ๋์ ํ์ด์ง(์ผ๋ฐ์ ์ผ๋ก 4KB ~ 8KB)์ ํฌํจ๋ ์ฌ๋ฌ ํ์ ์ ๊ทธ๋ ๋ฐฉ์
- ์ฌ์ฉ ์์: ์ผ๋ถ DBMS์ ๋ด๋ถ ๊ตฌํ์์ ์ฌ์ฉ
- ์ฅ์ : Table-level๋ณด๋จ ๋์์ฑ ๋๊ณ , Row-level๋ณด๋ค ๊ด๋ฆฌ๋น์ฉ ์ ์
- ๋จ์ : ํ๋์ ํ์ด์ง ์์ ์ ๊ธ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ
2. Lock์ ์ข ๋ฅ (Lock Type)
โ ๊ณต์ ์ ๊ธ (shared lock / s-lock): ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์ฌ์ฉํ๋ ๋ฝ.
- ๊ณต์ ์ ๊ธ์ ์ค์ ํ ํธ๋์ญ์
์์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด ์ฝ๊ธฐ(SELECCT) ์ฐ์ฐ๋ง ๊ฐ๋ฅํฉ๋๋ค.
- T1์ด id=101์ ์ฝ๊ธฐ ์ํด S-lock
- T2๋ ๊ฐ์ id=101์ ์ฝ๋ ๊ฒฝ์ฐ → ๊ฐ๋ฅ
- ํ์ง๋ง T2๊ฐ UPDATE ์๋ → ๋๊ธฐ
- ํ๋์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด์ ์ฌ๋ฌ ๊ฐ์ ๊ณต์ ์ ๊ธ (s-lock)์ด ๊ฐ๋ฅํฉ๋๋ค.
- T1์ด id=101์ ์ฝ๊ธฐ ์ํด S-lock
- T2๋ ๊ฐ์ id=101๋ฅผ s-lock → ๊ฐ๋ฅ
- ๋ค๋ฅธ ํธ๋์ ์ ๋ ์ฝ๊ธฐ ์ฐ์ฐ๋ง ์คํ ํ ์ ์์ต๋๋ค.
⇒ ์ด๋ฅผ ์ค์ํ๋ก ์๊ฐํด๋ณธ๋ค๋ฉด
→ 1๊ฐ์ ๋ฐ๊ถ๋ ์ฑ ์ ์ฝ๋ ์ฐ๋ฆฌ ๋ชจ๋๋, ์ถํ์ฌ๊ฐ ์์ ํ ๋ ค๊ณ ํ ๋ ์ฐ๋ฆฌ ๋ชจ๋ ๋ฉ์ถฐ์ผ ํ๋ค๋ ๊ฒ!
โก ๋ฐฐํ ์ ๊ธ (exclusive lock / x-lock): ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํ๋ ๋ฝ
- ๋ฐฐํ์ ๊ธ์ ์ค์ ํ ํธ๋์ญ์
์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด์ ์ฝ๊ธฐ ์ฐ์ฐ(read)๊ณผ ์ฐ๊ธฐ ์ฐ์ฐ(write) ๋ชจ๋ ๊ฐ๋ฅํฉ๋๋ค.
- T1์ด id=101์ ๋ํด UPDATE ์คํ
- → id=101์ ๋ํด X-lock ํ๋
- T2๊ฐ SELECT ์๋ํด๋ ๋๊ธฐ
- ํ๋์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด์๋ ํ๋์ ๋ฐฐํ์ ๊ธ(X-lock)๋ง ๊ฐ๋ฅํฉ๋๋ค.
- ๋์์ ์ฌ๋ฌ ๊ฐ์ ๋ฐฐํ์ ๊ธ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฝ๊ธฐ ์ฐ์ฐ(read)์ ์ฐ๊ธฐ ์ฐ์ฐ(write) ๋ชจ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
⇒ ์ด๋ฅผ ์ค์ํ๋ก ์๊ฐํด๋ณธ๋ค๋ฉด
→ ๋ฌธ์ ์์ ์ค์ผ ๋, ๋ค๋ฅธ ์ฌ๋์ ์ด๋์กฐ์ฐจ ๋ชป ํ๊ฒ ๋ง๋ ๊ฒ!
3. Locking ์ ํ์ฉํ ๋์์ฑ ์ ์ด ๊ธฐ๋ฒ.
โ ๋๊ด์ ๋ฝ (optimistic lock)
“์ถฉ๋์ ์ ์ ๋ ๊ฑฐ์ผ”๋ผ๋ ๋์ฒ์ ์ธ ๊ฐ์ ์์ ์ถ๋ฐํ ๋ฐฉ์์ ๋๋ค.
- ๊ฐ๋
- ๋๊ด์ ๋ฝ์ ์ถฉ๋์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ ๊ฐ์ ํ๊ณ , ์ฒ์์๋ Lock์ ๊ฑธ์ง ์์ต๋๋ค. ๋์ , ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ค๋ ์์ ์ ๋ฒ์ ์ ๋ณด(์: version ํ๋)๋ฅผ ๋น๊ตํ์ฌ ๋์์ฑ ์ถฉ๋์ด ๋ฐ์ํ๋์ง ํ์ธํฉ๋๋ค.
- ์๋ ๋ฐฉ์
- ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค (์: version = 3)
- ์์ ์์ ์ ์ค๋นํ๋ค
- ์ ๋ฐ์ดํธํ ๋ version = 3์ธ์ง ํ์ธ
- ๋ง์ผ๋ฉด ์ ๋ฐ์ดํธ & version ์ฆ๊ฐ
- ์๋๋ผ๋ฉด ์ถฉ๋๋ก ๊ฐ์ฃผ, ์ฌ์๋ํ๊ฑฐ๋ ์ฌ์ฉ์์๊ฒ ์๋ฆผ
- ํน์ง!
- ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ฌ์๋ ๋๋ ๋ณํฉ์ ํตํด์ ์ถฉ๋์ ํด๊ฒฐํฉ๋๋ค.
- Lock์ ์ง์ ๊ฑธ์ง ์๊ณ ๋ด๊ฐ ์ฝ์ version์ด ๋ง๋์ง ํ์ธ ํจ์ผ๋ก์จ ์ ํฉ์ฑ์ ๋ง์ถ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๊ฒฝํฉ์ด ์ ์ ํ๊ฒฝ์์ ์ฑ๋ฅ์ด ์ฐ์ํฉ๋๋ค. (ex.๊ฒ์ํ, ์ผํ๋ชฐ, ์กฐํ ์์ฃผ์ ์๋น์ค ๋ฑ ์ฝ๊ธฐ๊ฐ ๋ง์ ์์คํ )
โก ๋น๊ด์ ๋ฝ (Pessimistic Lock)
“์ถฉ๋์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค”๋ ๋น๊ด์ ์ธ ๊ด์ ์์ ์์ํฉ๋๋ค.
- ๊ฐ๋
- ๋น๊ด์ ๋ฝ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ๊ธฐ ์ ์ ๋จผ์ Lock์ ํ๋ํ์ฌ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ ๊ทผ์ ์ฐจ๋จํฉ๋๋ค. ์ค์ ๋ฐ์ดํฐ์ S-lock ๋๋ X-lock์ ๊ฑธ์ด, ํ์ฌ ํธ๋์ญ์ ๋ง ์์์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํฉ๋๋ค.
- ์๋ ๋ฐฉ์
- ๋ฐ์ดํฐ๋ฅผ SELECTํ๋ฉด์ Lock์ ํจ๊ป ํ๋ (SELECT ... FOR UPDATE)
- Lock์ ๊ฐ์ง ํธ๋์ญ์ ๋ง ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผ ๊ฐ๋ฅ
- ์์ ์๋ฃ ํ COMMIT → Lock ํด์
- ํน์ง!
- ์ค์ ๋ก ๋ฐ์ดํฐ์ lock์ ๊ฑธ์ด์ ์ ํฉ์ฑ์ ๋ง์ถ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์์ ์์ฒญ์ ๋ฐ๋ฅธ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ผ๊ณ ์์ํ๊ณ lock์ ๊ฑธ์ด๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋๋ค. → ๊ทธ๋ฌ๋ Lock ํ๋์ผ๋ก ์ฑ๋ฅ ์ ํ or ๋ฐ๋๋ฝ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
- ๋ฐ์ดํฐ์ ๋ํ ๋ฐฐํ์ ์ธ ์ก์ธ์ค ๊ถํ์ ๋ณด์ฅํ์ฌ ์ถฉ๋ ์์ฒด๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ๊ธฐ ์ ์ lock์ ํ๋ํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์์ ์ก์ธ์ค๋ฅผ ์ฐจ๋จํ๊ณ , lock์ ๊ฐ์ง ์ค๋ ๋๋ง ์ ๊ทผํ๋๋ก ์ ์ดํ๋ค. (ex. ๊ธ์ต, ์์ฝ, ์ฌ๊ณ ์์คํ ์ฒ๋ผ ๊ฒฝ์์ด ๋น๋ฒํ ํ๊ฒฝ )
๋ง๋ฌด๋ฆฌ.
๋๊ด์ ๋ฝ๊ณผ ๋น๊ด์ ๋ฝ์ ์๋ก ๋ฐ๋๋๋ ์ฑ๊ฒฉ์ ๊ฐ์ง ๋์์ฑ ์ ์ด ์ ๋ต์ ๋๋ค.
์ด๋ค ๋ฐฉ์์ ์ ํํด์ผ ํ๋์ง๋ ์์คํ ์ ํน์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ์ฝ๊ธฐ ์์ฃผ & ์ถฉ๋ ์ ์ → ๋๊ด์ ๋ฝ
- ๊ฒฝ์ ์ฌํ๊ณ ์ ํฉ์ฑ ์ค์ → ๋น๊ด์ ๋ฝ
์ฌ๋ฌ๋ถ์ ์๋น์ค ํ๊ฒฝ์ ๋ง๋ ๋์์ฑ ์ ์ด ์ ๋ต์ ์ ์ ํํ์ ์, ์์ ์ ์ด๊ณ ์ผ๊ด๋ ์์คํ ์ ์ ์งํ์๊ธธ ๋ฐ๋๋๋ค!
์ด์ ๊ธ์ ์ฝ์ด๋ณด๊ณ ์ถ๋ค๋ฉด?
2025.07.14 - [BackEnd๐/DB & SQL] - [Database] ๋์์ฑ ์ ์ด(Concurrency Control) - MVCC
[Database] ๋์์ฑ ์ ์ด(Concurrency Control) - MVCC
์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ์์ ์ ์ํํ๋ ค๊ณ ํ ๋, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ (๋์์ ์์ฉํ๋ ๋ค์ค ํธ๋์ญ์ ์ ์ํธ๊ฐ์ญ ์์ฉ์์ Database๋ฅผ
didcheck.tistory.com
*์ธ์ฉ*
https://dev.mysql.com/doc/refman/8.4/en/innodb-locking.html?utm_source=chatgpt.com
'BackEnd๐ > DB & SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [MySQL] InnoDB์์ PHANTOM READ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ. (0) | 2025.07.16 |
|---|---|
| [Database] ๋์์ฑ ์ ์ด(Concurrency Control) - MVCC (1) | 2025.07.14 |
| [MySQL / DDL] ์ ์ฝ์กฐ๊ฑด(Constraints)์ ๊ดํ์ฌ ! (4) | 2025.01.17 |
| [MySQL / DDL] CREAET ๋ถํฐ MODIFY ๊น์ง! (์ ์ฝ ์กฐ๊ฑด x) (8) | 2025.01.13 |
| [MySQL / DML] SELECT, ๋ฐ์ดํฐ ์กฐํ ๋ฐฉ๋ฒ (6) | 2025.01.07 |