๋ณธ ํฌ์คํ ์ ํ๊ต ์์ ์์ ์งํํ๋ ์ด๋ก ,์ค์ต์ ๋ํด ์ ๋ฆฌํ๋ ํฌ์คํ ์ ๋๋ค. ๊ณต๋ถ์ฉ์ผ๋ก ์์ฑํ๋ ํฌ์คํ ์ผ๋ก ์ค๋ฅ๊ฐ ์์ ์ ์์ต๋๋ค.
๋ณํ ์ ์ด(Concurrency Control)
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ์ฃผ์ ๋ชฉํ๋ ์ผ๊ด์ฑ๊ณผ ๊ณต์ฉ์ฑ์ด๋ค.
๊ณต์ฉ์ฑ์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ด์ฉ ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ ์๋ฏธํ๋๋ฐ,
์ด๋ ๊ฒ ๋๋ฉด, ์ถฉ๋์ด ๋ฐ์ํ ์ ๋ฐ์ ์๋ค.
๊ทธ๋ผ์๋ ๋์ ๊ณต์ฉ(Concurrent Sharing)์ ๊ณต์ฉ๋ ์ฆ๊ฐ, ์๋ต์๊ฐ์ ๋จ์ถ, ์์คํ ํ์ฉ๋ ์ฆ๋ ๋ฑ์ ์ด์ ์ ์ํด ํ์ํ๋ค.
๋ณํ ์ ์ด๋ ๋ค์ํ ๊ธฐ๋ฒ์ด ์กด์ฌํ๋ค.
- Locking: ๊ณต์ ํญ๋ชฉ์ ๋ํด ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ read๋ง ๊ฐ๋ฅํ๋๋ก (Shared Lock), ํน์ read/write ๋๋ค ๋ถ๊ฐ๋ฅํ๋๋ก(Exclusive Lock)
- 2Phase Locking: ๋ชจ๋ ํธ๋์ญ์ ๋ค์ด lock๊ณผ unlock์ ํ์ฅ๋จ๊ณ์ ์์ถ๋จ๊ณ๋ก ๊ตฌ๋ถํ์ฌ ์ํํ๋ค. ์ํธ ๋ฐฐ์ ์๋ฆฌ๋ฅผ ์ด์ฉํ ํธ๋์ญ์ ๊ฐ์ ์ง๋ ฌ์ฑ ๋ณด์ฅ ๊ธฐ๋ฒ์ผ๋ก ๋น๊ต์ ๊ฐ๋จํ๋ฉฐ ๋ฐ์ดํฐ๋ถ์ผ์น๋ฅผ ์๋ฐฉํ ์ ์์ง๋ง, lock๋๊ธฐ์๊ฐ๊ณผ deadlock์ด ๋ฐ์ํ ์ ์๋ค.
- MVCC(Multi-Version Concurrency Control): ํธ๋์ญ์ ์ ํ์ ์คํฌํ์ ์ ๊ทผ ๋ฐ์ดํ์ ์ฌ๋ฌ ๋ฒ์ ํ์์คํฌํ๋ฅผ ๋น๊ตํ์ฌ ์ง๋ ฌ๊ฐ๋ฅ์ฑ(serializable)์ด ๋ณด์ฅ๋๋ ๋ฒ์ ์ ์ ํํ๋ ๊ธฐ๋ฒ์ผ๋ก ์ต๊ทผ ๋ฐ์ดํฐ๊ฐ์ ์ ํํ๋ ๋ฐฉ์์ ํตํด ๋์์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋์์ ํด๊ฒฐํ ์ ์๋ค. Undo ๋ธ๋ก I/O์ ๋ฐ๋ฅธ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ณํ์ ์ด๊ฐ ํ์ํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
ํธ๋์ญ์ 1 | ํธ๋์ญ์ 2 | ๋ฐ์ํ๋ ๋ฌธ์ | ๋์ ์ ๊ทผ | |
case1 | read | read | ๋ฌธ์ ์์ | ํ์ฉ |
case2 | read | write | Dirty read(์์ด์ง๊ฑธ ๋ฏธ๋ฆฌ ์ฝ์ด์ด) Non-repeatable read(Readํ ๋ ๊ฐ์ด ๋ค๋ฆ) Phantom read(์๋ ํฌํ ์ถ๊ฐ) |
ํ์ฉ ๋๋ ๋ถ๊ฐ ์ ํ |
case3 | write | write | Lost Update(Overwrite) Inconsistency Cascading rollback |
lock์ ์ด์ฉํ์ฌ ์ ํ์ ์ผ๋ก ํ์ฉ |
์์ ๊ฐ์ด, ๋์์ ์คํ๋๋ ํธ๋์ญ์ ์ด ๊ฐ๊ฐ read์ write์ผ ๋, write write ์๊ธฐ๋ ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ณํ์ ์ด๊ฐ ํ์
ํธ๋์ญ์ ์ด ๊ฐ๊ฐ read, write๋ฅผ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํด ์ข ๋ ์์ธํ ๋ค๋ค๋ณด์
Dirty Read
์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ฌธ์ ์ด๋ค.
T1์์ rollback์ ํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ์ฌํญ๋ค์ด ์ ์ฅ๋์ง ์๊ณ ์ด๊ธฐ๋ก ๋์๊ฐ๋๋ฐ, T2์์๋ rollback์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋ค๊ฐ, rollback ์ดํ sum์ ํ์ฌ ์์ํ ๊ฐ๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค.
Non-repeatable Read(Unrepeatable Read)
ํธ๋์ญ์ ์ด ๋์ผํ ํญ๋ชฉ์ ๋๋ฒ ์ฝ์ ๋, ๋๋ฒ์ด ์๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์ด์ค๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
์ผ๊ด์ฑ์ด ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ฒ ๋๋ค.
Phantom Read
๊ธฐ์กด read์๋ ์๋ค๊ฐ, ๋ค๋ฅธ ํธ๋์ญ์ ์์ write ์ดํ read๋ฅผ ํ์ ๋, ํฌํ์ด ํ๋ ๋ ์๊ธฐ๋ ๋ฌธ์ ์ด๋ค.
์ด๋ฒ์๋ ๋ ๋ค Write๋ฅผ ํ ๋๋ฅผ ๋ค๋ค๋ณด์
- Lost Update (Overwrite):
๋ ํธ๋์ญ์ ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์์ ํ์ฌ ํ ํธ๋์ญ์ ์ ์ ๋ฐ์ดํธ๊ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํด ๋ฎ์ด์์์ง๋ ๋ฌธ์ - Inconsistency:
๋ค๋ฅธ ํธ๋์ญ์ ๋ค์ด ํน์ ํญ๋ชฉ ๊ฐ์ ๊ฐฑ์ ํ๋ ๋์, ํ ํธ๋์ญ์ ์ด ๋ ๊ฐ์ ํญ๋ชฉ ์ค ์ด๋ค ๊ฒ์ ๊ฐฑ์ ๋๊ธฐ ์ ์ ๊ฐ์ ์ฝ๊ณ , ๋ค๋ฅธ ๊ฒ์ ๊ฐฑ์ ๋ ํ์ ๊ฐ์ ์ฝ๊ฒ๋์ด, ๋ฐ์ดํฐ์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๋ ์ํฉ - Cascading Rollback:
ํ ํธ๋์ญ์ ์ ์คํจ๋ก ์ธํด ์์กด ๊ด๊ณ์ ์๋ ๋ค๋ฅธ ํธ๋์ญ์ ๋ค๋ ์ฐ์์ ์ผ๋ก ๋กค๋ฐฑ๋๋ ๋ฌธ์
์ง๋ ฌ ๊ฐ๋ฅ์ฑ๊ณผ ์ค์ผ์ค
์ค์ผ์ค๋ง์ ํธ๋์ญ์ ์ฐ์ฐ์ ์คํ ์์๋ฅผ ๊ฒฐ์ ํ๋ ์ค์ํ ์์์ด๋ค.
์ง๋ ฌ ๊ฐ๋ฅ์ฑ์ ์ด๋ฌํ ์ค์ผ์ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์ ํธ๋์ญ์ ๊ฐ์ ๋์์ฑ์ ํ์ฉํ๊ธฐ ์ํ ๊ธฐ์ค์ด๋ค.
- ์ค์ผ์ค : ํธ๋์ญ์ ์ฐ์ฐ๋ค์ ์คํ ์์ ๋๋ ํธ๋์ญ์ ์ฐ์ฐ๋ค์ ์กฐํฉ
- ์ง๋ ฌ ์ค์ผ์ค(serial schedule): ํธ๋์ญ์
๋ค์ด ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ ์ค์ผ์ค์ด๋ค. ์ฆ ํ๋์ ํธ๋์ญ์
์ด ์๋ฃ๋ ํ์ ๋ค์ ํธ๋์ญ์
์ด ์คํ
- ex) ํธ๋์ญ์ {T1, ... , Tn}์ด ์์ฐจ์ ์ผ๋ก ์คํ๋จ
- ๊ต์ฐจ์คํ(Interleaving)์ด ์์
- ๋ชจ๋ ์ง๋ ฌ ์ค์ผ์ค์ ์ ํธ๊ฐํ๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ์ ์ง
- n๊ฐ์ ํธ๋์ญ์ ์ ๋ํด, ๊ฐ๋ฅํ ๋ชจ๋ ์ง๋ ฌ ์ค์ผ์ค์ n!๊ฐ์ง ์กด์ฌ
- ๋น์ง๋ ฌ์ค์ผ์ค(nonserial schedule): ๊ต์ฐจ์คํ(Interleaving)๋ ์ค์ผ์ค๋ก, ํธ๋์ญ์ {T1,...,Tn}์ด ๋ณ๋ ฌ์คํ๋๋ค.
- ์ง๋ ฌ ๊ฐ๋ฅ ์ค์ผ์ค(serializable schedule): ๋น์ง๋ ฌ ์ค์ผ์ค์ด ์ง๋ ฌ ์ค์ผ์ค๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๋ ๊ฒฝ์ฐ ์ง๋ ฌ ๊ฐ๋ฅ ์ค์ผ์ค
- ์ ์: n๊ฐ์ ํธ๋์ญ์ {T1,...,Tn}์ ๋ํ ์ค์ผ์ค S๊ฐ ํน์ ์ง๋ ฌ ์ค์ผ์ค S'์ ๋๋ฑํ๋ค๋ฉด, S๋ ์ง๋ ฌ ๊ฐ๋ฅํ๋ค
์ค์ผ์ค ๋๋ฑ์ฑ(Schedule Equivalent)
์ค์ผ์ค ๋๋ฑ์ฑ์ด๋ ๋ ์ค์ผ์ค์ด ๋์ผํ ๋ฐ์ดํฐ ์ํ๋ฅผ ๋ณด์ฅํ ์ ์๋์ง ํ๊ฐํ๋ ๊ธฐ์ค์ด๋ค.
์ฆ, ๋ ์ค์ผ์ค์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ค๋ฉด, ์ด๋ค ์ค์ผ์ค์ ๋๋ฑํ๋ค๊ณ ํ๋จํ ์ ์๋ค.
์ถฉ๋ ๋๋ฑ (Conflict Equivalent)
์ ์
- ์ค์ผ์ค S์ S'๊ฐ ์ถฉ๋ํ์ง ์๋ ์ฐ์ฐ์ ์์๋ง ๋ฐ๊ฟ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ๊ฒฝ์ฐ, ๋ ์ค์ผ์ค์ ์ถฉ๋ ๋๋ฑ
- ์ด๋ ์์๋ฅผ ๋ณ๊ฒฝํ๋ค๋ ๊ฒ์ ์๋ก ๋ค๋ฅธ ํธ๋์ญ์ ์ ์์ ์ด ๊ต์ฐจํ๋ ๊ฒฝ์ฐ์ ํํด ์๋ก๊ฐ์ ์์๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ์๋ฏธํ๊ณ , ํธ๋์ญ์ ๋ด๋ถ ์์๋ ์ ์ง๋์ด์ผํ๋ค.
- ์ถฉ๋ ๋๋ฑํ ์ค์ผ์ค์ ๋์ผํ Conflict Graph๋ฅผ ๊ฐ์ง
- ๋ค๋ง ์ด๋ ๊ฒ ์ด์์ ์ผ๋ก ๊ทธ๋ฆฌ๊ธฐ๊ฐ ์ฝ์ง ์์ ์ ํ ๊ทธ๋ํ(precedence grpah)๋ก ๊ทธ๋ฆด ์ ๋ฐ์ ์๋ค.
์ด๋ ๊ฒ ๋น์ง๋ ฌ์ธ ๋ ํธ๋์ญ์ ์ ์์๋ฅผ ๋ณ๊ฒฝํด์, ์ง๋ ฌ์ธ ์ค์ผ์ค๊ณผ ์ถฉ๋ ๋๋ฑํ ๊ฒฝ์ฐ๋ฅผ ์ถฉ๋์ง๋ ฌ๊ฐ๋ฅ์ค์ผ์ค(conflict serializable)์ด๋ผ๊ณ ํ๋ค.
๋ทฐ ๋๋ฑ(View Equivalent)
์ ์
์ค์ผ์ค S์ S'๊ฐ ๋ค์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ๋ทฐ ๋๋ฑ:
- ๋ชจ๋ ๋ฐ์ดํฐ ์์ดํ ์ ๋ํด ์ด๊ธฐ ์ฝ๊ธฐ(Read)๊ฐ ๋์ผํด์ผ ํจ.
- ๊ฐ ๋ฐ์ดํฐ ์์ดํ ์ ์ต์ข ์ฐ๊ธฐ(Write)๊ฐ ๋์ผํด์ผ ํจ.
- ์ฝ๊ธฐ ์ฐ์ฐ์ด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ผ ํจ(์ฝ๋ ๊ฐ์ด ๊ฐ์์ผ ํจ).
-> ๋์ผํ ๋ฐ์ดํฐ x์ ๋ํด์ ์ต์ด ์ฝ๊ธฐ, ์ฐ๊ธฐ/์ฝ๊ธฐ, ๋ง์ง๋ง์ฐ๊ธฐ ๋ฅผ ์ํํ๋ ํธ๋์ญ์ ์ ์์๊ฐ ๋์ผ
๋ทฐ ์ง๋ ฌ ๊ฐ๋ฅ ์ค์ผ์ค(View Serializable Schedule)
- ์ด๋ค ์ง๋ ฌ ์ค์ผ์ค๊ณผ ๋ทฐ ๋๋ฑํ ์ค์ผ์ค
- ๋ชจ๋ ์ถฉ๋ ์ง๋ ฌ ๊ฐ๋ฅ ์ค์ผ์ค์ ๋ทฐ ์ง๋ ฌ ๊ฐ๋ฅ, ์ญ์ ์ฑ๋ฆฝํ์ง ์๋๋ค
์ถฉ๋ ์ง๋ ฌ ๊ฐ๋ฅ์ฑ ๊ฒ์ฌ
์ ํ ๊ทธ๋ํ๋ฅผ ํตํด ์ถฉ๋ ์ง๋ ฌ ๊ฐ๋ฅ์ฑ์ ๊ฒ์ฌํ ์ ์๋ค.
์ ํ ๊ทธ๋ํ๋ ๋ฐฉํฅ๊ทธ๋ํ์ด๋ฉฐ, ๋ ธ๋ Ti์ ๊ฐ์ Ti->Tj์ผ๋ก ํํํ ์ ์๋ค.
์ ํ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ธ์ ๋, ์ฌ์ดํด์ด ์๋ ๊ฒฝ์ฐ ์ถฉ๋ ์ง๋ ฌ ๊ฐ๋ฅํ๋ค. (์ ๊ทธ๋ฆผ ์์๋ ์ฌ์ดํด์ด ์กด์ฌํ์ฌ ์ง๋ ฌ ๋ถ๊ฐ๋ฅ ์ค์ผ์ค)
์ ํ ๊ทธ๋ํ์์ ์ ํ ์์๋ก ์์ ์ ๋ ฌ๋ ๋ชจ๋ ์ค์ผ์ค์ ์ง๋ ฌ ๊ฐ๋ฅ
์ด๋ ๊ฒ, ์ง๋ ฌ ๊ฐ๋ฅ์ฑ์ ์ํด์๋ ์คํ ์ค์ธ ํธ๋์ญ์ ๋ค์ ์ค์ผ์ค์ด ์ง๋ ฌ ์ค์ผ์ค๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋์ง ํ์ธํด์ํ๋ค.
ํ์ง๋ง ์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ ์ด๋ ค์์ด ๋ฐ์ํ ์ ์๋ค.
- ํธ๋์ญ์ ์คํ ํ ์ง๋ ฌ ๊ฐ๋ฅ์ฑ ๊ฒ์ : ์ด๋ฏธ ์คํ๋ ์ค์ผ์ค์ด ์ง๋ ฌ ๊ฐ๋ฅํ์ง ์๋ค๋ฉด, ํด๋น ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๊ฑฐ๋ ์ทจ์ํด์ผํจ
- ์ง์์ ์ผ๋ก ๋ค์ด์ค๋ ํธ๋์ญ์ ์ฒ๋ฆฌ: ์์คํ ์์ ํธ๋์ญ์ ์ด ๊ณ์ ๋ค์ด์ค๋ ๊ฒฝ์ฐ, ์ด๋ค ์ค์ผ์ค์ด ์ธ์ ์์๋๊ณ ๋๋๋์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ด๋ ต๋ค.
๋ณํ ์ ์ด ๊ธฐ๋ฒ
์์ ๊ฐ์ ์ด๋ ค์์ ๊ทน๋ณตํ๊ธฐ ์ํด, ํธ๋์ญ์ ์ ์คํํ๋ฉด์ ์ง๋ ฌ ๊ฐ๋ฅ์ฑ์ ๋ณด์ฅํ ์ ์๋ ๋ค์ํ ๋ณํ ์ ์ด ๊ธฐ๋ฒ์ด ์ฌ์ฉ๋๋ค.
- 2๋จ๊ณ ์ ๊ธ ๊ธฐ๋ฒ(Two_Phase Locking, 2PL) : ํธ๋์ญ์
์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ ์ Lock์ ๊ฑธ์ด ๋ค๋ฅธ ํธ๋์ญ์
์ ์ ๊ทผ์ ์ฐจ๋จ, ๋๋จ๊ณ๋ก ์งํ
- ํ์ฅ ๋จ๊ณ: ์๋ก์ด ์ ๊ธ์ ํ๋.
- ์ถ์ ๋จ๊ณ: ๋ชจ๋ ์ ๊ธ์ ํด์
- ๋จ์ : ๊ต์ฐฉ ์ํ(deadlock)๋ฐ์ ๊ฐ๋ฅ์ฑ
- ํ์์คํฌํ ๊ธฐ๋ฐ ๊ธฐ๋ฒ
- ๊ฐ ํธ๋์ญ์ ์ ํ์์คํฌํ๋ฅผ ๋ถ์ฌํ๊ณ ์์๋ฅผ ์ ํ๊ณ , ์ถฉ๋์ ์๋ฐฉ.
- MVCC(Multi-Version Concurrency Control):
- ๋ฐ์ดํฐ์ ์ฌ๋ฌ ๋ฒ์ ์ ์ ์งํ์ฌ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ฐ์ฐ์ ์ถฉ๋์ ๋ฐฉ์ง (PostgreSQL๋ฑ์์ ์ฌ์ฉ)
- ๋๊ด์ฑ ๊ฒ์ฆ: ํธ๋์ญ์ ์คํ ์ค์๋ ์ถฉ๋์ ํ์ฉํ์ง๋ง, ๊ฒ์ฆ ๋จ๊ณ์์ ์ง๋ ฌ ๊ฐ๋ฅ์ฑ์ ํ์ธ.
- Snapshot Isolation: ํธ๋์ญ์ ์ด ์์๋ ๋ ๋ฐ์ดํฐ์ ์ค๋ ์ท์ ์์ฑํ์ฌ ์ผ๊ด์ฑ์ ์ ์ง
๋กํน(Locking)
์ ์: ์ํธ ๋ฐฐ์ (๋ ์ ์ ์ด)๋ฅผ ํตํด ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ์ ๋์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ํ๋ ๊ณผ์
๋ค์ ๋งํด ์ ๊ธ์ด ๋ ๋ฐ์ดํ ์งํฉ์ ์์ฑ
๋ฐ์ดํฐ ๊ฐ์ฒด์ ๋ฐฐํ์ ์ ๊ทผ์ ๋ณด์ฅํ๋ค.
์ฑ์ง
- ๋น๊ณต์ ์ฑ: ๋ฐ์ดํฐ ๊ฐ์ฒด๋ ํ๋ฒ์ ํ๋์ ํธ๋์ญ์ ๋ง ์ฌ์ฉํ ์ ์๋ค
- ๋ถ๋ถํจ๊ณผ์ ๋ฐฐ์ : ํธ๋์ญ์ ์ด ์๋ฃ๋์ง ์์ ์ํ์์ ์ค๊ฐ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ ธ์ถ๋์ง ์๋๋ค
- ๋จ์ผ ์์ ์: ํ๋์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ ํ ํธ๋์ญ์ ์๋ง ์ ๊ธ(lock)๋๋ค
- ์ ๊ธ ํด์ ์ ํ: lock์ ํด์ ํ ์ ์๋ ๊ถํ์ ํด๋น ์ ๊ธ์ ๊ฑด ํธ๋์ญ์ ์๋ง ์๋ค.
๊ท์ฝ
- Lock ์ฐ์ฐ ์ ์ ์กฐ๊ฑด: ํธ๋์ญ์ T๋ read(x)๋๋ write(x) ์ฐ์ฐ์ ์ํํ๊ธฐ ์ ์ ๋ฐ๋์ lock(x) ์ฐ์ฐ์ ์คํํด์ผ ํ๋ค.
- Lock๊ณผ Unlock์ ์์: ํธ๋์ญ์ T๋ ๋ชจ๋ ์ฐ์ฐ์ ์ข ๋ฃํ๊ธฐ ์ ๊น์ง unlock(x)์ฐ์ฐ์ ์คํํ ์ ์์.
- ๋ค์ค Lock ๋ฐฉ์ง: ํธ๋์ญ์ T๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ด๋ฏธ x์ ๋ํด ์ ๊ธ์ ๊ฑธ์์ ๊ฒฝ์ฐ, ํด๋น ๋ฐ์ดํฐ์ ๋ํด ์ถ๊ฐ ์ ๊ธ์ ๊ฑธ ์ ์์
- Unlock ์ ํ: ํธ๋์ญ์ T๋ ์์ ์ด ๊ฑธ์ง ์์ lock(x)๋ฅผ ํด์ ํ ์ ์์
ํ์ ์กฐ๊ฑด
- ๋ช ์ธ: ๋กํน์ ๊ตฌํ์ ์์ ํ๊ณ ๋ช ํํด์ผํ๋ค
- ์ต์์ฑ: ์ต์ํ์ ์์์ผ๋ก ์ต๋ํ์ ์๊ธ ํจ๊ณผ๋ฅผ ๋ฌ์ฑํด์ผํ๋ค
- ์ถฉ๋ ๊ฒ์ฌ: ์ถฉ๋์ ์ต์ํ ํ๊ณ , ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํด์ผํ๋ค
๋กํน ๋ชจ๋ ํ์ฅ
- ๊ณต์ฉ locking, shared-lock(s-lock): ๊ณต์ฉ๋ ์ ๊ทผ ํ์ฉ, read๋ง ํ์ฉ
- ์ ์ฉ locking, exclusive-lock(x-lock): ๋ฐฐํ์ ์ ๊ทผ, read/write ๋ชจ๋ ๋ถํ
์๋ฆฝ์ฑ
๋กํฌ์ ๋ ๊ฐ์ง ๋ชจ๋๊ฐ ๋์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋์ง๋ฅผ ๊ฒฐ์
๊ณต์ฉ ๋กํน ๊ท์ฝ
๊ณต์ฉ ๋ฐ ์ ์ฉ ๋กํฌ์ ์ฌ์ฉ ๋ฐฉ์์ ์ ์ํ์ฌ ๋ฐ์ดํฐ ์ถฉ๋์ ๋ฐฉ์ง
- ์ฝ๊ธฐ/์ฐ๊ธฐ ์ lock ํ๋: T๊ฐ ๋ฐ์ดํฐ x๋ฅผ ์ฝ์ผ๋ ค๋ฉด lock-S(x)๋ lock-X(x)์ ๋จผ์ ํ๋ํด์ผํจ, ์ฐ๋ ค๋ฉด lock-X(x)์ฐ์ฐ์ ๋จผ์ ํ๋ํด์ผ ํจ
- ์๋ฆฝ์ฑ ๊ฒ์ฌ: ๊ฐ xx์ ๋ํด Lock-S(x) ๋๋ Lock-X(x)๋ฅผ ์์ฒญํ ๋, ๋ค๋ฅธ ํธ๋์ญ์ ์ด x์ ๋ํ ์ถฉ๋ ์ํ์ ๋กํฌ๋ฅผ ๋ณด์ ์ค์ด๋ผ๋ฉด ๋๊ธฐํด์ผ ํจ.
- ๋ชจ๋ ๋กํฌ ํด์ : T๋ ์คํ ์ข ๋ฃ ์ ์ ํ๋ํ ๋ชจ๋ ๋กํฌ(lock)๋ฅผ ๋ฐ๋์ ํด์ ํด์ผํจ
- ์์ ์ด ๊ฑธ์ง ์์ ๋กํฌ ํด์ ๊ธ์ง: T๋ ์์ ์ด ๊ฑธ์ง ์์ ๋ฐ์ดํฐ์ ๋กํฌ๋ฅผ ํด์ ํ ์ ์์
2๋จ๊ณ ๋กํน ๊ท์ฝ(2PL)
ํ์ฅ ๋จ๊ณ์ ์ถ์ ๋จ๊ณ๋ผ๋ ๋ ๊ฐ์ง ๋จ๊ณ๋ฅผ ํตํด ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๋ฐฉ์์ ์ ์ํ๋ค
1. ํ์ฅ ๋จ๊ณ(growing phase) - ํธ๋์ญ์ ์ด ํ์ํ ๋ชจ๋ ์์์ ํ๋ณดํ๋ ๋จ๊ณ
: ํธ๋์ญ์ ์ lock๋ง ์ํํ๊ณ unlock์ ์ํํ ์ ์๋ ๋จ๊ณ
2. ์ถ์ ๋จ๊ณ(shrinking phase) - ํธ๋์ญ์ ์ด ๋ ์ด์ ํ์ํ์ง ์์ ์์์ ํด์
: ํธ๋์ญ์ ์ unlock๋ง ์ํํ๊ณ lock์ ์ํํ ์ ์๋ ๋จ๊ณ
์ค์ผ์ค ๋ด์ ๋ชจ๋ ํธ๋์ญ์ ๋ค์ด 2๋จ๊ณ ๋กํน ๊ท์ฝ์ ์ค์ํ๋ค๋ฉด ๊ทธ ์ค์ผ์ค์ ์ง๋ ฌ ๊ฐ๋ฅ
๊ทธ๋ฆผ ์๋ฃ์ ๊ฐ์ด, unlock ์ ๊น์ง๋ locking๋ง ๊ณ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ดํ๋ก๋ unlock๋ง ๊ณ์ํ๋ค. ์ด๋ ๊ฒ locking์ ํ๋ฉด ์ง๋ ฌ์ด ๋๋ค.
์ฒซ๋ฒ์งธ ์์์ ๊ฒฝ์ฐ, T1์ด lock์ ๋๋ฒ ํ๊ณ ๋์ unlock์ ๋๋ฒ ํ๋ค. T2๋ ๋ง์ฐฌ๊ฐ์ง๋ก T1์ด ์ธ๋ฝ์ ํ์๋ง์ lock์ ํ๊ณ , unlock์ ํ๋ค. ๋ ๋ค 2PLP๋ฅผ ๋ง์กฑํ๋ฉฐ ์ง๋ ฌ ๊ฐ๋ฅ์ด๋ค.
์ด ์์์์๋ T1์ด lock -> unlock -> lock ->unlock ์ผ๋ก 2PLP๊ฐ ์๋๋ฉฐ, T2๋ํ lock->unlock->lock->unlock์ผ๋ก 2PLP๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ์ง๋ ฌ ๊ฐ๋ฅ์ฑ์ ๋ณด์ฅํ์ง ์๋๋ค.
๋ฌผ๋ก 2PL์ด ์๋๋๋ผ๋ ์ง๋ ฌ์ผ ์๋ ์๋ค.(์ฆ ํ์์กฐ๊ฑด์ ์๋๋ค.)
์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๋ ๋์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์๋ฐ2PLP(strict 2PLP)๊ณผ ์๊ฒฉ 2PLP(rigorous 2PLP) ๊ฐ์ ๋ณํ๋ ๊ท์ฝ์ ์ฌ์ฉํ๋ค. ๋๋ถ๋ถ์ ์์ฉ DBMS๋ ์๋์ ๋๊ฐ์ง ๊ท์ฝ์ ์ฌ์ฉํ๋ค.
- ์๋ฐ 2๋จ๊ณ ๋กํน ๊ท์ฝ:
- ๋ชจ๋ ๋ ์ ์ ๊ธ(lock-X)๋ ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง ํด์ (unlock)๋์ง ์์
- ํธ๋์ญ์ ์ด ๋๋๊ธฐ ์ ์ ๋ ์ ์ ๊ธ์ด ํ๋ฆฌ์ง ์์ผ๋ฏ๋ก, ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ธ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค
- ๋ค๋ฅธ ํธ๋์ญ์ ์ด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ๊ฒ์ ๋ฐฉ์ง
- ์ฐ์ ๋ณต๊ท๊ฐ ์ผ์ด๋์ง ์์
- ์๊ฒฉ 2๋จ๊ณ ๋กํน ๊ท์ฝ:
- ๋ชจ๋ ์ ๊ธ์ ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง ํด์ ๋์ง ์์(์ด๋ lock-X, lock-S ๋ชจ๋ ํด๋น)
- ํธ๋์ญ์ ๋ค์ด ์๋ฃํ๋ ์์๋๋ก ์ง๋ ฌํ ๊ฐ๋ฅ
๋ค์ค ๋จ์ ๋กํน(Multiple Granularity Locking)
- ๋น๋ฒํ ์ ๊ธ/ํด์ ์ฐ์ฐ์ ๋ฌธ์ ์ :
์ ๊ธ์ ์ค์ ํ๊ฑฐ๋ ํด์ ํ๋ ์ฐ์ฐ ์์ฒด๊ฐ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์.
๋ฐ๋ผ์, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ค ๋จ์ ๋กํน ๋ฉ์ปค๋์ฆ์ด ํ์. - ๋ฐ์ดํฐ ์์ดํ
์ ํฌ๊ธฐ์ ๋ฐ๋ฅธ ๋กํน ๋จ์:
- ํฐ ๋กํน ๋จ์(Coarse Granularity):
- ํธ๋์ญ์ ์ด ํฌ๊ณ , ๋์ ๋ฒ์๋ฅผ ์ ๊ทธ๋ ๊ฒฝ์ฐ ์ ํฉ.
- ์ฅ์ : ์ ๊ธ ์ฐ์ฐ ๊ฐ์.
- ๋จ์ : ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ธฐํ ๊ฐ์.
- ์์ ๋กํน ๋จ์(Fine Granularity):
- ์งง์ ํธ๋์ญ์ ์ด๋ ์ธ๋ถ์ ์ธ ๋ฐ์ดํฐ ์์ ์ ์ ํฉ.
- ์ฅ์ : ์ธ๋ฐํ ์ ์ด ๊ฐ๋ฅ.
- ๋จ์ : ์ ๊ธ ์ฐ์ฐ ์ฆ๊ฐ๋ก ์ค๋ฒํค๋ ๋ฐ์.
- ํฐ ๋กํน ๋จ์(Coarse Granularity):
- ๋ค์ค ๋จ์ ๋กํน ๊ณ์ธต ํธ๋ฆฌ:
๋ฐ์ดํฐ๋ฒ ์ด์ค, ๊ตฌ์ญ, ํ์ผ, ๋ ์ฝ๋ ๋ฑ ๊ณ์ธต์ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋กํน ๋จ์๋ฅผ ์ ์.
ํธ๋์ญ์ ์ ์์ ๋ฒ์์ ๋ฐ๋ผ ์ ์ ํ ์์ค์์ ์ ๊ธ.
MySQL์ Table-level locking vs Row-level lcoking
1. Table -level locking(ํ ์ด๋ธ ์์ค ์ ๊ธ)
ํน์ง
- ์ ์ฒด ํ ์ด๋ธ์ ๋ํด ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ ์์ ์ค ํ๋๋ง ์ํ ๊ฐ๋ฅ.
- ๋์์ฑ์ ๋ฎ์ง๋ง, ๊ฐ๋จํ ์ฝ๊ธฐ ์์ ์ด ๋ง์ ๊ฒฝ์ฐ ์ ๋ฆฌ
- ์ฃผ๋ก ์ฝ๊ธฐ์ ์ฐ๊ธฐ ์์ ์ ๋ํด ์ ์ฒด ํ ์ด๋ธ์ ์ ๊ทธ๋ ๋ฐฉ์์ผ๋ก ์๋
LOCK TABLES student READ;
-- ์์
์คํ
UNLOCK TABLES;
LOCK TABLES student WRITE;
-- ์์
์คํ
UNLOCK TABLES;
์ฅ์ : ๋จ์ํ ๊ตฌํ, ์ฐ๊ธฐ ์์ ์ ์ถฉ๋์ ์์ ํ ๋ฐฉ์ง
๋จ์ : ๋์์ฑ ์ฒ๋ฆฌ ์ ํ์ , ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์์๋ ์ฑ๋ฅ ์ ํ
2. Row-level locking(ํ ์์ค ์ ๊ธ)
ํน์ง
- ํน์ ํ์ ๋ํด์๋ง ์ ๊ธ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก, ๋์์ฑ์ ๋์ด๊ณ ์ฑ๋ฅ์ ์ต์ ํ ํ๋ค
- ๋๊ท๋ชจ ํธ๋์ญ์ ์ฒ๋ฆฌ์ ์ ํฉํ๋ค
-- ๊ฐฑ์ ์ ์ํ ์ ๊ธ
START TRANSACTION;
SELECT * FROM student WHERE id=1234 FOR UPDATE;
-- ์์
์คํ
COMMIT;
--๊ณต์ ์ ๊ธ
START TRANSACTION;
SELECT * FROM student WHERE id=1234 LOCK IN SHARE MODE;
-- ์์
์คํ
COMMIT;
์ฅ์ : ๋์์ฑ ๋์ ์์ ์ ์ ๋ฆฌํ๋ฉฐ, ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์์ ์ฑ๋ฅ ์ต์ ํ
๋จ์ : ์ ๊ธ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ณ , ์ถฉ๋ ์ ๊ต์ฐฉ ์ํ(deadlock)๊ฐ ๋ ์ ์๋ค.
* ๊ต์ฐฉ ์ํ๋ ๋ชจ๋ ํธ๋์ญ์ ์ด ์คํ์ ์ ํ ์งํํ์ง ๋ชปํ๊ณ , ์๋ก ์์์ ํด์ ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋ฌดํ ๋๊ธฐ ์ํ๋ฅผ ์๋ฏธํ๋ค.
Multi Version Concurrency Control(MVCC)
MVCC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ๋ฐ์ดํฐ์ ์ฌ๋ฌ ๋ฒ์ ์ ์ ์งํ์ฌ, ํธ๋์ญ์ ์ด ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉํ๋ ๋์์ฑ ์ ์ด ๋ฐฉ์
์ด๋ค ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ์ ์ ๊ทผ์ ๋ฐ์ดํฐ์ ๋ค์ค๋ฒ์ ์ํ์ค ์ง๋ ฌ๊ฐ๋ฅ์ฑ์ด ๋ณด์ฅ๋๋ ๋ฒ์ ์ ์ ํํ์ฌ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ์ด๋ค
ํน์ง
- ์ฌ๋ฌ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ์์คํ
์ ์ ์ฅ.
- ์ผ๋ถ ์ฝ๊ธฐ ์ฐ์ฐ์ ๊ธฐ์กด ๋ฐฉ์์์ ๊ฑฐ์ ๋ ์ ์์ง๋ง, MVCC๋ ๊ณผ๊ฑฐ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ.
- ์ง๋ ฌ ๊ฐ๋ฅ์ฑ์ ์ ์งํ๋ฉด์๋ ์ฑ๋ฅ์ ํฅ์.
ํ์ ๋ณ MVCC ์คํค๋ง
- ํ์์คํฌํ ๊ธฐ๋ฐ (Timestamp Ordering):ํธ๋์ญ์ ์ ํ์์คํฌํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ ๋ฒ์ ์ ๊ด๋ฆฌ.
- 2๋จ๊ณ ๋กํน ๊ธฐ๋ฐ (Two-Phase Locking): ๊ธฐ์กด 2๋จ๊ณ ๋กํน์ ํ์ฅํ์ฌ ๋ค์ค ๋ฒ์ ์ ์ง์.
- ๊ฒ์ฆ ๋ฐ ์ค๋ ์ท ๊ฒฉ๋ฆฌ (Validation and Snapshot Isolation): ๋ฐ์ดํฐ๋ฅผ ๊ฒฉ๋ฆฌ๋ ์ค๋ ์ท์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ถฉ๋์ ๋ฐฉ์ง.
MVCC์ ๋ฌธ์ ์
- ์ ์ฅ ๊ณต๊ฐ์ ์ฆ๊ฐ: ๋ฐ์ดํฐ์ ์ฌ๋ฌ ๋ฒ์ ์ ์ ์ฅํด์ผ ํ๋ฏ๋ก UNDO ๋ก๊ทธ์ ๊ฐ์ ์ถ๊ฐ์ ์ธ ์ ์ฅ์๊ฐ ํ์.
- ์ค๋ ์ท ์ค๋ฒํค๋: ์ค๋๋ ์ค๋ ์ท์ด ํ์ ์ด์์ผ๋ก ์ ์ง๋ ๊ฒฝ์ฐ, ์ฑ๋ฅ ์ ํ์ ๊ด๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์.
MVCC์ ์ฃผ์ ์ ๊ทผ๋ฒ
Approach 1: PostgreSQL, Firebird/Interbase, SQL Server
- ๋ฐฉ๋ฒ:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ์ ๋ค์ค ๋ฒ์ ์ ๋ณ๋์ ๋ ์ฝ๋๋ก ์ ์ฅ.
- ๋ถํ์ํ ์ค๋๋ ๋ ์ฝ๋๋ฅผ ์ ๋ฆฌ(๊ฐ๋น์ง ์ปฌ๋ ์ )ํ์ฌ ์ ์ฅ ๊ณต๊ฐ์ ๊ด๋ฆฌ.
- ์ฅ์ :
- ๋ฐ์ดํฐ์ ๋ฒ์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ง.
- ์ฝ๊ธฐ ์ฐ์ฐ์ ์ถฉ๋์ ์ต์ํ.
- ๋จ์ :
- ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฆฌํด์ผ ํจ.
Approach 2: Oracle, MySQL/InnoDB
- ๋ฐฉ๋ฒ:
- ์ต์ ๋ฐ์ดํฐ๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ์ ์ฅ.
- UNDO ๋ก๊ทธ๋ฅผ ํ์ฉํ์ฌ ์ด์ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ตฌ์ฑ.
- ์ฅ์ :
- ์ ์ฅ ๊ณต๊ฐ ํจ์จ์ ๊ด๋ฆฌ.
- ํ์ํ ๋๋ง ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ตฌ์ฑ.
- ๋จ์ :
- UNDO ๋ก๊ทธ์ ํฌ๊ธฐ๊ฐ ์ปค์ง ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ.
์ฌ์ง์๋ฃ์ Undo Segement๋ ์ด์ ๋ฐ์ดํฐ ๋ฒ์ ์ ์ ์ฅํ๋ ๊ณต๊ฐ์ด๋ฉฐ, SCN์ ๋ธ๋ก์ด ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋ ์์ ์ ์ ๋ณด์ด๋ค. select๊ฐ 10023์ด๊ณ , 10024 ์ดํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์๋๋ผ๋, SCN 10023 ์์ ์ ๋ฐ์ดํฐ ์ํ๋ฅผ ๋ฐํํ๊ธฐ ์ํด 10006, 10021์ ์ฝ๋๋ก ํ๋ค.
์ด๋ฅผ ํตํด ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค.
SQL์ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค(Transaction Isolation Level)
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ์ด ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋๋ก ํ๋ ์ ๋๋ฅผ ์กฐ์ ํ๋ ์ค์ ์ด๋ค.
SQL-92 ํ์ค์ ๋ฐ๋ฅด๋ฉด 4๊ฐ์ง ๊ฒฉ๋ฆฌ ์์ค์ด ์ ์๋๋ค:
- READ UNCOMMITTED:
- ํธ๋์ญ์ ์ด ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๊น์ง ์ฝ์ ์ ์์.
- ๊ฐ์ฅ ๋ฎ์ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉฐ, ๋์์ฑ์ ๋์ง๋ง ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์.
- (mysql) Binary Log๊ฐ ์๋์ผ๋ก Row Based์ ๊ธฐ๋ก๋จ
- READ COMMITTED:
- ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ค์ ์ฝ์ ์ ์๋ค. ex) T2์์ ์์ ์ค์ T1์ ์ปค๋ฐ์ด ์๋ฃ๋๋ฉด ๊ทธ ๋ฐ์ดํฐ์ ๋ํด์๋ ์ฝ์ด์จ๋ค. -> ๋ํฐ๋ฆฌ๋๋ ์์ง๋ง Nonrepeatable, ํฌํ ๋ฆฌ๋๋ ๋ฐ์
- ํธ๋์ญ์ ์ด ์คํ๋๋ ๋์, ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๋ณ๊ฒฝํ ๋ฐ์ดํฐ๋ ๋ณผ ์ ์์.
- Oracle๊ณผ PostgreSQL์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค.
- (mysql) Binary Log๊ฐ ์๋์ผ๋ก Row Based์ ๊ธฐ๋ก๋จ
- ์ฌ๋ฌ ์ธ์ ์ด ๋์ ์ ์ํ์ commit์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋๊ณ ๋๋ ํธ๋์ญ์ ์ด ์์๋ก ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ฐธ์กฐํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ
- REPEATABLE READ:
- ํธ๋์ญ์ ์ด ์์๋ ์์ ์ ๋ฐ์ดํฐ ์ํ๋ฅผ ์ ์ง. -> ๋ณธ์ธ ๊ธฐ์ค commit์ด ๋๋์ผ ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํ ์ ์๊ณ , ์ปค๋ฐ ์ด์ ์๋ ์๋ ๋ฒ์ snapshot์ ์ฝ์
- ๋์ผ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ์ ๋, ํญ์ ๊ฐ์ ๊ฐ์ ๋ฐํ.
- MySQL์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค.
- SERIALIZABLE:
- ๊ฐ์ฅ ๋์ ๊ฒฉ๋ฆฌ ์์ค.
- ํธ๋์ญ์ ์ด ์ง๋ ฌ์ ์ผ๋ก ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ฅ.
- ๋์์ฑ์ ๊ฐ์ฅ ๋ฎ์ง๋ง, ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์๋ฒฝํ ์ ์ง.
๊ฐ ๊ฒฉ๋ฆฌ ์์ค์์์ ๋ฌธ์ ๋ฐ์ ์ฌ๋ถ
:์๋ ํ๋ ๊ฐ ๊ฒฉ๋ฆฌ ์์ค์์ ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ค๋ค
๋ ๋ฒจ์ด ์๋๋ก ๊ฐ์๋ก ๋๋ ค์ง์ง๋ง ๋ฌธ์ ์ ์ ์ค์ด๋ ๋ค.
Isolation Level | Dirty Read | Nonrepeatable Read | Phantom Read |
READ UNCOMMITTED | Yes | Yes | Yes |
READ COMMITTED | No | Yes | Yes |
REPEATABLE READ | No | No | Yes (MySQL: No*) |
SERIALIZABLE | No | No | No |
(MySQL์ด Repeatable read์์๋ phantom read๋ No์ธ ์ด์ ๋ MVCC๋๋ฌธ์ด๋ค.)
MySQL์์ ์๋์ ๊ฐ์ด ์ ์ฉ ๊ฐ๋ฅํ๋ค
MySQL์์์ ํธ๋์ญ์ ์ค๊ณ
1. AutoCommit ์ค์ ํ์ธ(๊ธฐ๋ณธ๊ฐ: true)
- AutoCommit ํ์ธ ๋ฐฉ๋ฒ: SELECT @@AUTOCOMMIT;
- AutoCommit ์ค์ ๋ณ๊ฒฝ:
- ๋ช ๋ น๋ฌธ์ผ๋ก ๋ณ๊ฒฝ: SET autocommit=0;
- ์๋ฒ ์ค์ ํ์ผ ๋ณ๊ฒฝ:
- my.cnf ํ์ผ์ ์๋ ๋ด์ฉ์ ์ถ๊ฐํ๊ณ ์๋ฒ ์ฌ์์
[mysqld]init_connect='SET autocommit=0'autocommit=OFF
2. Table Type์ด InnoDB์ธ์ง ํ์ธ (InnoDB๋ง ํธ๋์ญ์ ์ ์ง์ํจ)
- ํ์ธ ๋ฐฉ๋ฒ: SHOW TABLE STATUS;
- ๋ณ๊ฒฝ ๋ฐฉ๋ฒ: ALTER TABLE ํ ์ด๋ธ๋ช ENGINE=INNODB;
3. Transaction Isolation Level(๊ฒฉ๋ฆฌ ์์ค)ํ์ธ (๊ธฐ๋ณธ๊ฐ: REPATABLE-READ)
- ๊ฒฉ๋ฆฌ ์์ค ํ์ธ ๋ฐฉ๋ฒ: SELECT @@GLOBAL.transaction_isolation; SELECT @@SESSION.transaction_isolation;
- ๊ฒฉ๋ฆฌ ์์ค ๋ณ๊ฒฝ:
- ๋ช ๋ น๋ฌธ์ผ๋ก ๋ณ๊ฒฝ: SET SESSION TRANSACTION ISOLATION LEVEL [์ํ๋ ๋ ๋ฒจ];
- ์๋ฒ ์ค์ ํ์ผ ๋ณ๊ฒฝ:
- my.cnf ํ์ผ์ ์๋ ๋ด์ฉ์ ์ถ๊ฐํ๊ณ ์๋ฒ ์ฌ์์
-
transaction-isolation=READ-COMMITTED
- [mysqld]
ํธ๋์ญ์ ๋ ๋ฒจ์ ๋ฐ๋ฅธ ์คํ ๊ฒฐ๊ณผ ํ ์คํธ(from. MySQL)
๊ฐ ํธ๋์ญ์ ๋ ๋ฒจ๋ง๋ค ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ ๋์ค๋์ง ํ์ธํด๋ณด์
1. update & read(Dirty Read ํ ์คํธ)
์ด๊ธฐ ํ ์ด๋ธ์ {A:1, B:10} , {A:2,B:0}์ผ๋ก ์์ํ๋ค.
์์ํ๊ธฐ์ ํธ๋์ญ์ T1, T2์ ์คํ ํ๊ฒฝ์์ autocommit์ ๊บผ์ค๋ค.
REPEATABLE READ
๋จผ์ MySQL ๊ธฐ๋ณธ ๋ ๋ฒจ์ธ REPEATABLE READ์์ ์์ํ๋ค. ์ด๋ก ์ ๋ํฐ๋ฆฌ๋, ํฌํ ๋ฆฌ๋, ๋ ผ๋ฆฌํผํฐ๋ธ ๋ฆฌ๋ ๋ชจ๋ ์์ด์ผํ๋ค.
์คํ๊ฒฐ๊ณผ REPEATABLE READ ๋ ๋ฒจ์์ T1์ update๋ T2์ select์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๋ผ์ธ3,4๋ฅผ ๋ฐ๋ผ ์๋๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌ์ํค๊ณ ์ปค๋ฐ์ ํด์ฃผ์๋ค. ๋๋จธ์ง ๋ ๋ฒจ์์๋ ๋์ผํ๊ฒ ์งํํ ๊ฒ
READ COMMITTED
์ด๋ก ์ READ COMMITTED๋ ๋ํฐ ๋ฆฌ๋๋ ์๊ณ ๋๋จธ์ง ํ์์ ๋ํ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๋ํฐ๋ฆฌ๋๊ฐ ์๊ธฐ ๋๋ฌธ์, T1์ update๋ T2์ ์ํฅ์ด ์๋ค.
๋ง์ฝ T1์์ B-10์ ํ ์ฐ์ฐ์ ๋ํด Commit์ ํ๊ณ ๋์, T2๊ฐ ์ฝ๋ ์์ ์๋ค๋ฉด, sum(B)์ ๊ฐ์ 0์ผ๋ก ๋์์ ๊ฒ์ด๋ค.
READ UNCOMMITTED
๋ง์ง๋ง์ผ๋ก, UNCOMMITTED๋ฅผ ํ ์คํธํด๋ณธ๋ค. ๋ํฐ๋ฆฌ๋๊ฐ ์๋ ๋ ๋ฒจ์ด๋ผ์ ์ํฅ์ด ์์ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ UNCOMMITTED ๋ ๋ฒจ์์๋ ์ปค๋ฐ์ ํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ํฐ๋ฆฌ๋ ํ์์ด ๋ํ๋๋ค.
2. insert&read(Phantom Read Test)
์ด๋ฒ์๋ PhantomRead๋ฅผ ํ ์คํธํด๋ณธ๋ค. ์๋๋๋ก๋ฉด REPATABLE READ๋ ๋ฒจ์์๋ ๋ฐ์ํ๋ ํ์์ด์ง๋ง, MySQL์ MVCC์ด๋ฏ๋ก ๋ฐ์ํ์ง ์๋๋ค. ์ด ์ฌ์ค ๋ํ ์ง์ ํ์ธํด๋ณด๊ฒ ๋ค.
์ด๋ฒ ์์๋ T2์ ํธ๋์ญ์ ์ด ์งํ๋๋ ๋์ T1์์ ์๋ก์ด ๊ฐ์ INSERTํ๊ณ ์ปค๋ฐ์ ํ ๊ฐ์ ๋ํด T2๊ฐ ์ฝ์ด์ค๋์ง๋ฅผ ๋ณด๋ ์์ ๋ค.
์ฝ์ด์จ๋ค๋ฉด ํฌํ ๋ฆฌ๋๊ฐ ๋ฐ์ํ ๊ฒ์ด๊ณ ์ฝ์ด์ค์ง ์๋๋ค๋ฉด ๋ฐ์ํ์ง ์๋๊ฒ์ผ๋ก ๋ณผ ์ ์๋ค.
์ด๋ฒ์ ์ญ์์ผ๋ก ์คํํด๋ณด๊ฒ ๋ค.
READ UNCOMMITED
UNCOMMITED๋ถํฐ ์ดํด๋ณด์ (UNCOMMITTED๋ ๋ํฐ๋ฆฌ๋๋ถํฐ ๋ฐ์ํ์ผ๋ ํฌํ ๋ฆฌ๋๋ ๋น์ฐํ ๋ฐ์ํ๊ฒ ์ง๋ง.. )
์ฐ์ T2์ ์ฒซ select ๊ฒฐ๊ณผ์ด๋ค.
2~4๋ผ์ธ๋๋ก, T1์์๋ ํธ๋์ญ์ ์์, ๋ฐ์ดํฐ ์ฝ์ , ์ปค๋ฐ์ ์๋ฃํ์ํ์ด๋ค.
์ฐ์ธก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด 3,150 ์ด ์๋ก ์ฝ์ ๋๊ฒ์ ๋ณผ ์ ์๋ค. select๋ฅผ ์ฐ์์ผ๋ก ๋๋ฒํ๋๋ฐ ์๋ก์ด ํฌํ์ด ์๊ธฐ๋ ํฌํ ๋ฆฌ๋ ํ์์ด ๋ฐ์
READ COMMITTED
COMMITTED๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ์ด๋ค.
์์๋๋ก T1์ ์ปค๋ฐ๋ ๊ฐ์ ์ํ์ฌ select 2๋ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ค.
REPEATABLE READ
์๋๋๋ก๋ผ๋ฉด ์์ ๋ ๋ ๋ฒจ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ผํ์ง๋ง MySQLํ๊ฒฝ์ด๋ฏ๋ก ํฌํ ๋ฆฌ๋๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ค.
์์ง T2์ ์ปค๋ฐ์ด ๋์ง ์์์, T1์ ์ปค๋ฐ์ด ๋ฐ์๋ ํ์ฌ์ ํ ์ด๋ธ์ด ์๋ ์ปค๋ฐ ์ด์ ์ ์ค๋ ์ท์ ์ฝ๊ณ ์๊ธฐ ๋๋ฌธ์ ํฌํ ๋ฆฌ๋ ํ์์ ๋ณผ ์ ์๋ค.
T2์ปค๋ฐ ์ดํ select๋ฅผ ํด๋ณด๋ฉด ์ด์ ์ค๋ ์ท์ด ์๋ ํ์ฌ ํ ์ด๋ธ์ ์ฝ์ด์ค๋ฏ๋ก ๋ฐ์๋ ๊ฐ์ ์ฝ์ด์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฆ , MySQL์ REPEATABLE READ ๋ ๋ฒจ์์๋, ํธ๋์ญ์ ์ ์์ํ์ผ๋ฉด ์ปค๋ฐ์ ์๋ฃํด์ผ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํ ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํ ์ ์๋ค. ๊ทธ ์ ๊น์ง๋ MVCC์ ์ํด ์ด์ ์ Snapshot๋ง์ ์ฝ์ด์จ๋ค.
๊ฑฐ์ ๋๋ถ๋ถ์ ์ํฉ์์๋ ์ด๋ ๊ฒ ๋์ง๋ง, ์ค๋ ์ท์ฝ๊ธฐ๊ฐ ์๋ ํ์ฌ ํ ์ด๋ธ ์ฝ๊ธฐ๋ก ์กฐํ๋ฅผ ํ๋ ๊ฒฝ์ฐ์๋ ์ปค๋ฐ ์ด์ ์๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํ ๋ณ๋์ฌํญ์ ํ์ธํ ์๋ ์๋ค๊ณ ํ๋ค.(SELECT FOR UPDATE..)
์์ธํ ๊ฒ์ ์๋ ๋ธ๋ก๊ทธ ๋ด์ฉ์ ์ฐธ๊ณ
https://mangkyu.tistory.com/299
'Database > ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DB] ๐ Big Data ๊ธฐ์ (feat. MapReduce, Hadoop) (3) | 2024.12.07 |
---|---|
[DB] ๐ NoSQL์ ํน์ง๊ณผ ์ข ๋ฅ (0) | 2024.12.07 |
[DB] ๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ฑ ๐๏ธ ๊ตฌ์กฐ with MySQL (0) | 2024.12.06 |
[DB] ๐ ํธ๋์ญ์ (Transaction), ํ๋ณต(Recovery) with MySQL (0) | 2024.12.02 |
[DB] ๐ ํจ์์ ์ข ์์ฑ(Funtional Dependency)๊ณผ ์ ๊ทํ(Normalization) (0) | 2024.11.30 |