๐ ํธ๋์ญ์
๊ฒฉ๋ฆฌ์์ค์ ์ ๋ฆฌํด๋ณด์
- ์ทจ์ง: ํธ๋์ญ์
๊ฒฉ๋ฆฌ์์ค์ ์ด๋ค ๊ฒ๋ค์ด ์๊ณ ์ด๋ค ์์ค์์ ์ด๋ป๊ฒ ์จ์ผํ ์ง ์ด์ฐธ์ ์ ๋ฆฌ๋ฅผ ํ๊ณ ๊ฐ๋ ค๊ณ ๊ธ์ ๋จ๊ฒจ๋ณธ๋ค.
์ฐธ๊ณ ์๋ฃ: https://www.youtube.com/watch?v=yWO13BNyuw4&list=WL&index=17
Level 0: READ UNCOMMITTED
- ๊ฐ๋
: "๊ฒฉ๋ฆฌ์ฑ ๋ฌด์"
- ํธ๋์ญ์
์ ๋ณ๊ฒฝ ๋ด์ฉ์ด Commit์ด๋ Rollback์ ์๊ด์์ด ๋ค๋ฅธ ํธ๋์ญ์
์๊ฒ ๋ณด์
๋๋ค.
- ์น๋ช
์ ๊ฒฐํจ: Dirty Read (์กด์ฌํ์ง๋ ์๋ ์ ๋ น ๋ฐ์ดํฐ๋ฅผ ์ฝ์)
Example
Tx 1: UPDATE ๊ณ์ข SET ์์ก=50(์งํ ์ค)
Tx 2: SELECT ์์ก -> 50๋ง์ ์ฝ์(Dirty Read!)
Tx 1: ์๋ฒ ์๋ฌ ๋ฐ์ -> ROLLBACK(์์ก 0์)
Level 1: READ COMMITTED
- ๊ฐ๋
: "ํ์ ๋ ๊ฒ๋ง ๋ฏฟ๋๋ค"
- ์ด๋ค ํธ๋์ญ์
์ ๋ณ๊ฒฝ๋ด์ฉ์ด Commit ๋์ด์ผ๋ง ๋ค๋ฅธ ํธ๋์ญ์
์ด ์กฐํํ ์ ์๋ค.
- ํด๊ฒฐ: Dirty Read ๋ฐฉ์ง
- ๋ฌธ์ : Non-repeatable Read ๋ฐ์๊ฐ๋ฅ(์กฐํํ ๋๋ง๋ค ๊ฐ์ด ๋ณํจ)
- Oracle, PostgreSQL ์ ๊ธฐ๋ณธ ์ค์ ๊ฐ
Example
Tx 1: UPDATE ์์ก=50 (Commit ์ )
Tx 2: SELECT ์์ก -> 100๋ง์ ์กฐํ(Dirty Read ๋ฐฉ์ง!)
Tx 1: Commit (์์ ํ์ )
Tx 2: ๋ค์ SELECT ์์ก -> 50๋ง์ ์กฐํ(Non-reapeatable Read!)
-- ํ๋์ ํธ๋์ญ์
๋ด์์ธ ์กฐํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
Level 2: REPEATABLE READ
- ๊ฐ๋
: "์ฒ์ ๋ณธ ์ค๋
์ท ์ ์ง"
- ํด๊ฒฐ: Non-repeatable Read ๋ฐฉ์ง!
- ํ๊ณ: Phantom Read ๋ฐ์ ๊ฐ๋ฅ(์๋ก์ด ํ ์ฝ์
์ ๊ฒฐ๊ณผ ํ ๊ฐ์ ๋ณํ)
- MYSQL InnoDB, PostgreSQL ์ ๊ฐ์์ ๊ธฐ์ (Next-Key Lock, Snapshot isolation)๋ก ์ด ๋ ๋ฒจ์์ ํฌํ
๋ฆฌ๋๊น์ง ๋๋ถ๋ถ ๋ฐฉ์ด
Example
Tx 1: SELECT ์์ก -> 100๋ง์(Snapshot Read)
Tx 2: UPDATE ์์ก=50; COMMIT;
Tx 1: ๋ค์ ์กฐํ -> 100๋ง์ ์กฐํ(๋ฐ๋ณต ์ฝ๊ธฐ ๋ณด์ฅ!)
Tx 2: INSERT ID=11 ์ ๊ท ํ; COMMIT;
TX 1: ๋ฒ์ SELECT -> ํ ๊ฐ์๊ฐ ๋์ด๋จ(ANSI Phantom Read ํ์)
Level 3: SERIALIZABLE
- ๊ฐ๋
: "์๋ฒฝํ ๊ฒฉ๋ฆฌ"
- ํธ๋์ญ์
๋ค์ด ์์ฐจ์ ์ผ๋ก ์คํ๋๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค.
- ๊ธฐ์ (ANSI): ์ฝ๊ธฐ ์์
์กฐ์ฐจ ๊ณต์ ์ ๊ธ(S-LOCK)์ ํ๋ํด์ผ ํจ.
- ํด๊ฒฐ: Phantom Read ํฌํจ ๋ชจ๋ ์ด์ ํ์ ๋ฐฉ์ง
- MYSQL Inno DB๋ ๋ชจ๋ SELECT์ Shared Next-key Lock์ ๊ฐ์ ํ์ฌ ์ธ์ ๋ฒ์๊น์ง ๋ชจ๋ ์ ๊ทผ๋ค.
Example
Tx 1: SELECT * WHERE ๊ฐ๊ฒฉ > 100 (Shared Next-Key Lock)
Tx 2: INSERT ์ํ (๊ฐ๊ฒฉ=150) ์๋ -> ๋ฌดํ ๋๊ธฐ(Wait)
Tx 1: ๋ค์ ๊ฐ์ SELECT -> ์ ํฉ์ฑ ์์ ๋ณด์ฅ
Tx 1: COMMIT (Lock ํด์ )
Tx 2: ๊ทธ์ ์์ผ ์ฝ์
์์
์ํ