ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(isolation level)์ด๋ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์ฒ๋ฆฌ๋ ๋ ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋๋ค.
- READ UNCOMMITED (=DIRTY READ)
- ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋๋ค.
- READ COMMITED
- Oracle ๊ฐ์ DBMS์์ ์ฃผ๋ก ์ฌ์ฉ
- REPEATABLE READ
- MySQL์์ ์ฌ์ฉ
- SERIALIZABLE
- ๋์์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋๋ค.
์๋๋ก ๋ด๋ ค๊ฐ ์๋ก ํธ๋์ญ์ ๊ฐ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ(๊ณ ๋ฆฝ) ์ ๋๊ฐ ๋์์ง๋ฉฐ, ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋ฎ์์ง๋ค.
ํ์ง๋ง, SERIALIZABLE์ด ์๋ ๋๋จธ์ง 3๊ฐ๋ ํฌ๊ฒ ์ฑ๋ฅ์ ๊ฐ์ ์ด๋ ์ ํ๋ ๋ฐ์ํ์ง ์๋๋ค.
5.4.1 READ UNCOMMITED
๊ฐ ํธ๋์ญ์
์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT, ROLLBACK ์ฌ๋ถ์ ์๊ด์์ด
๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ณด์ธ๋ค.
- A ํธ๋์ญ์ ์์ ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ commit์ ํ๊ธฐ ์ ์ธ๋ฐ๋ B ํธ๋์ญ์ ์์๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
- ํ์ง๋ง, ๋ฌธ์ ๋ A ํธ๋์ญ์ ์ด ๋กค๋ฐฑ์ด ๋์์ ๊ฒฝ์ฐ์ด๋ค. B ํธ๋์ญ์ ์์๋ ํด๋น ๋ฐ์ดํฐ๊ฐ ์ ์์ ์ด๋ผ ํ๋จํ๊ณ ์ถํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ก๋ค ๋ณด์๋คํ๋ ์ด๋ฌํ ํ์์ ๋ํฐ ๋ฆฌ๋(Dirty read)๋ผ๊ณ ํ๋ค.
์ ๋ ์ฌ์ฉ๋์ด์ ์๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
5.4.2 READ COMMITED (NON-REPEATABLE READ)
์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ ํ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ๋ํฐ ๋ฆฌ๋ ํ์์ ์ฌ๊ธฐ์ ์ ๋ ๋ฐ์ํ์ง ์๋๋ค.
์ด๋ค ๋ฐ์ดํฐ๋ COMMIT์ด ์๋ฃ๋ ๋ฐ์ดํฐ
๋ง ๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- COMMIT ํ๊ธฐ ์ ๊น์ง๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด ์๋, ์ธ๋ ๋ก๊ทธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- COMMIT์ด ์๋ฃ๋ ์ดํ์๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
- ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋๋ฐ..
- ํ ํธ๋์ญ์
์์ ๋์ผํ SELECT๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผํ๋ค๋
REPEATABLE READ ์ ํฉ์ฑ
์ ์ด๊ธ๋๋ค.
- ํ ํธ๋์ญ์
์์ ๋์ผํ SELECT๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผํ๋ค๋
5.4.3 REPEATABLE READ
MySQL์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ๊ฐ์ง MySQL์์๋ ์ต์ REPEATABLE READ
๊ฒฉ๋ฆฌ ์์ค ์ด์์ ์ฌ์ฉํด์ผ ํ๋ค.
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์๋ค.
- READ COMMITED ๊ฒฉ๋ฆฌ์์ค์์ ๋ฐ์ํ ๋ฐ์ดํฐ ์กฐํ์ ๋ถ์ ํฉ์ด ๋ฐ์ํ์ง ์๋๋ค.
MVCC(Multi Version Concurrency Control)
์ ์ด์ฉํด์ ์ธ๋ ๋ก๊ทธ์ ๋ฐฑ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ด๋ค. (MVCC ์ค๋ช ์ 4.2.3 ์ ํ์ธ)- READ COMMITED์ ์ฐจ์ด์ ์ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์ ์ฌ๋ฌ ๋ฒ์ ๊ฐ์ด๋ฐ ๋ช๋ฒ์งธ ์ด์ ๋ฒ์ ๊น์ง ์ฐพ์ ๋ค์ด๊ฐ๋์ง์ ์ฐจ์ด๊ฐ ์๋ค.
ํธ๋์ญ์ ๊ณผ MVCC์ ๋ํด์..
๋ชจ๋ InnoDB์ ํธ๋์ญ์ ์ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ(์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฐ)๋ฅผ ๊ฐ์ง๋ค. ์ธ๋ ์์ญ์๋ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋์๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ๊ฐ ํฌํจ๋์ด์๋ค. (์๋ ์ฐธ์กฐ)
+--------+--------+---------+
| TRX-ID | field1 | field 2 |
+--------+--------+---------+
| 6 | 10000 | test1 |
+--------+--------+---------+
| 12 | 50000 | test9 |
+--------+--------+---------+
์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ๋ถํ์ํ๋ค๊ณ ํ๋จํ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ๋ฅผ ํ๋ค.
REPEATABLE READ
๊ฒฉ๋ฆฌ ์์ค์์๋ MVCC
๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์คํ์ค์ธ ํธ๋์ญ์
๊ฐ์ด๋ฐ ๊ฐ์ฅ ์ค๋๋ ํธ๋์ญ์
๋ฒํธ๋ณด๋ค ํธ๋์ญ์
๋ฒํธ๊ฐ ์์ ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ ์ญ์ ํ ์๊ฐ ์๋ค.
REPEATABLE READ ์๋ ๋ฐฉ์
์๋ ๊ทธ๋ฆผ์ REPEATABLE READ ์๋ ๋ฐฉ์์ ๋ณด์ฌ์ค๋ค.
- 10๋ฒ(ํธ๋์ญ์ )์ด SELECT๋ฅผ ์คํํ๋ค.
- ์ดํ 12๋ฒ(ํธ๋์ญ์
)์ด Lara โ Toto๋ก ๋ณ๊ฒฝ์ ํ๋ค.
- ๋ณ๊ฒฝ๋๊ธฐ ์ ๋ฐ์ดํฐ๋ ์ธ๋๋ก๊ทธ์ ๋ฐฑ์ ๋๋ค.
- 12๋ฒ(ํธ๋์ญ์ )์ด ์ปค๋ฐ์ ํ๋ค.
- 10๋ฒ(ํธ๋์ญ์
)์ด ๋ค์ Lara๋ฅผ ์กฐํํ๋ค.
- ์ฌ๊ธฐ์ ๋ง์ฝ, ์ปค๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ฉด? REPEATABLE READ์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์ด๊ธ๋๊ฒ ๋๋ค.
- ์ฌ์ค ์กฐํํ ์๋ ์๋ค. REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ ์์ ์ ํธ๋์ญ์ ๋ฒํธ๋ณด๋ค ๊ฐ๊ฑฐ๋ ์์ ํธ๋์ญ์ ๋ฒํธ์ ๋ฐ์ดํฐ ๋ง ๋ณผ ์ ์๊ฒ ๋๋ค. (์ค์!)
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ธ๋๋ก๊ทธ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
PHANTOM READ (PHANTOM ROW)
์๋ ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณด์.
- 10๋ฒ ํธ๋์ญ์ ์ด emp_no๊ฐ 50000 ์ด์์ธ ๊ฐ์ ์กฐํํ๊ณ ์๋ค. (1๊ฑด ์กฐํ)
- 12๋ฒ ํธ๋์ญ์ ์ด 50001๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ปค๋ฐ์ ํ๋ค.
- 10๋ฒ ํธ๋์ญ์
์ด ๋๊ฐ์ด SELECT๋ฅผ ํ๋ค.
- ์ด๋ ์๋ ๊ฐ์์ผ๋ฉด ์ธ๋๋ก๊ทธ์ ์๋ ๊ฐ์ ๊ฐ์ ธ์์ ์ด์ ์ฒ๋ผ 1๊ฑด์ ๋ฐ์ดํฐ๋ง ์กฐํํด์์ผ ํ๋ค. ํ์ง๋ง 12๋ฒ ํธ๋์ญ์ ์ด ์ถ๊ฐํ ๋ฐ์ดํฐ๊น์ง ์ด 2๊ฐ์ ์กฐํ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ์ด ๋๋ค.
์ ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ ๊น?
์ธ๋ ๋ ์ฝ๋์๋ ์ ๊ธ์ ๊ฑธ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ SELECT โฆ FOR UPDATE
, SELECT โฆ LOCK IN SHARE MODE
๋ก ์กฐํ๋๋ ๋ ์ฝ๋๋ ์ธ๋ ์์ญ์ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ธํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ฌ ๋ ์ฝ๋์ ๊ฐ(์ ๊ธ ์์ด)์ ๊ฐ์ ธ์ค๊ฒ ๋๋ ๊ฒ์ด๋ค.
SELECT FOR UPDATE vs LOCK IN SHARE MODE
5.4.4 SERIALIZABLE
- ๊ฐ์ฅ ๋จ์ํ๊ณ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
- 4๊ฐ์ง ๊ฒฉ๋ฆฌ์์ค์์ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ์ ์ผ ๋จ์ด์ง๋ค.
- ์์ํ SELECT ์กฐํ๋ ์ ๊ธ์ ๊ฑธ๊ฒ ๋๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋๋ค.
*๋ฌผ๋ก ์์์ ์ค๋ช
ํ SELECT โฆ FOR UPDATE
, SELECT โฆ LOCK IN SHARE MODE
์ฟผ๋ฆฌ๊ฐ์ด ์์ธ์ ์ธ ์ํฉ์ ์ ์ธํ๊ณ ๋ง์ด๋ค.
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(isolation level)์ด๋ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์ฒ๋ฆฌ๋ ๋ ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋๋ค.
- READ UNCOMMITED (=DIRTY READ)
- ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋๋ค.
- READ COMMITED
- Oracle ๊ฐ์ DBMS์์ ์ฃผ๋ก ์ฌ์ฉ
- REPEATABLE READ
- MySQL์์ ์ฌ์ฉ
- SERIALIZABLE
- ๋์์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋๋ค.
์๋๋ก ๋ด๋ ค๊ฐ ์๋ก ํธ๋์ญ์ ๊ฐ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ(๊ณ ๋ฆฝ) ์ ๋๊ฐ ๋์์ง๋ฉฐ, ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋ฎ์์ง๋ค.
ํ์ง๋ง, SERIALIZABLE์ด ์๋ ๋๋จธ์ง 3๊ฐ๋ ํฌ๊ฒ ์ฑ๋ฅ์ ๊ฐ์ ์ด๋ ์ ํ๋ ๋ฐ์ํ์ง ์๋๋ค.
5.4.1 READ UNCOMMITED
๊ฐ ํธ๋์ญ์
์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT, ROLLBACK ์ฌ๋ถ์ ์๊ด์์ด
๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ณด์ธ๋ค.
- A ํธ๋์ญ์ ์์ ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ commit์ ํ๊ธฐ ์ ์ธ๋ฐ๋ B ํธ๋์ญ์ ์์๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
- ํ์ง๋ง, ๋ฌธ์ ๋ A ํธ๋์ญ์ ์ด ๋กค๋ฐฑ์ด ๋์์ ๊ฒฝ์ฐ์ด๋ค. B ํธ๋์ญ์ ์์๋ ํด๋น ๋ฐ์ดํฐ๊ฐ ์ ์์ ์ด๋ผ ํ๋จํ๊ณ ์ถํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ก๋ค ๋ณด์๋คํ๋ ์ด๋ฌํ ํ์์ ๋ํฐ ๋ฆฌ๋(Dirty read)๋ผ๊ณ ํ๋ค.
์ ๋ ์ฌ์ฉ๋์ด์ ์๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
5.4.2 READ COMMITED (NON-REPEATABLE READ)
์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ ํ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ๋ํฐ ๋ฆฌ๋ ํ์์ ์ฌ๊ธฐ์ ์ ๋ ๋ฐ์ํ์ง ์๋๋ค.
์ด๋ค ๋ฐ์ดํฐ๋ COMMIT์ด ์๋ฃ๋ ๋ฐ์ดํฐ
๋ง ๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- COMMIT ํ๊ธฐ ์ ๊น์ง๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด ์๋, ์ธ๋ ๋ก๊ทธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- COMMIT์ด ์๋ฃ๋ ์ดํ์๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
- ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋๋ฐ..
- ํ ํธ๋์ญ์
์์ ๋์ผํ SELECT๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผํ๋ค๋
REPEATABLE READ ์ ํฉ์ฑ
์ ์ด๊ธ๋๋ค.
- ํ ํธ๋์ญ์
์์ ๋์ผํ SELECT๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผํ๋ค๋
5.4.3 REPEATABLE READ
MySQL์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ๊ฐ์ง MySQL์์๋ ์ต์ REPEATABLE READ
๊ฒฉ๋ฆฌ ์์ค ์ด์์ ์ฌ์ฉํด์ผ ํ๋ค.
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์๋ค.
- READ COMMITED ๊ฒฉ๋ฆฌ์์ค์์ ๋ฐ์ํ ๋ฐ์ดํฐ ์กฐํ์ ๋ถ์ ํฉ์ด ๋ฐ์ํ์ง ์๋๋ค.
MVCC(Multi Version Concurrency Control)
์ ์ด์ฉํด์ ์ธ๋ ๋ก๊ทธ์ ๋ฐฑ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ด๋ค. (MVCC ์ค๋ช ์ 4.2.3 ์ ํ์ธ)- READ COMMITED์ ์ฐจ์ด์ ์ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์ ์ฌ๋ฌ ๋ฒ์ ๊ฐ์ด๋ฐ ๋ช๋ฒ์งธ ์ด์ ๋ฒ์ ๊น์ง ์ฐพ์ ๋ค์ด๊ฐ๋์ง์ ์ฐจ์ด๊ฐ ์๋ค.
ํธ๋์ญ์ ๊ณผ MVCC์ ๋ํด์..
๋ชจ๋ InnoDB์ ํธ๋์ญ์ ์ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ(์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฐ)๋ฅผ ๊ฐ์ง๋ค. ์ธ๋ ์์ญ์๋ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋์๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ๊ฐ ํฌํจ๋์ด์๋ค. (์๋ ์ฐธ์กฐ)
+--------+--------+---------+
| TRX-ID | field1 | field 2 |
+--------+--------+---------+
| 6 | 10000 | test1 |
+--------+--------+---------+
| 12 | 50000 | test9 |
+--------+--------+---------+
์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ๋ถํ์ํ๋ค๊ณ ํ๋จํ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ๋ฅผ ํ๋ค.
REPEATABLE READ
๊ฒฉ๋ฆฌ ์์ค์์๋ MVCC
๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์คํ์ค์ธ ํธ๋์ญ์
๊ฐ์ด๋ฐ ๊ฐ์ฅ ์ค๋๋ ํธ๋์ญ์
๋ฒํธ๋ณด๋ค ํธ๋์ญ์
๋ฒํธ๊ฐ ์์ ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ ์ญ์ ํ ์๊ฐ ์๋ค.
REPEATABLE READ ์๋ ๋ฐฉ์
์๋ ๊ทธ๋ฆผ์ REPEATABLE READ ์๋ ๋ฐฉ์์ ๋ณด์ฌ์ค๋ค.
- 10๋ฒ(ํธ๋์ญ์ )์ด SELECT๋ฅผ ์คํํ๋ค.
- ์ดํ 12๋ฒ(ํธ๋์ญ์
)์ด Lara โ Toto๋ก ๋ณ๊ฒฝ์ ํ๋ค.
- ๋ณ๊ฒฝ๋๊ธฐ ์ ๋ฐ์ดํฐ๋ ์ธ๋๋ก๊ทธ์ ๋ฐฑ์ ๋๋ค.
- 12๋ฒ(ํธ๋์ญ์ )์ด ์ปค๋ฐ์ ํ๋ค.
- 10๋ฒ(ํธ๋์ญ์
)์ด ๋ค์ Lara๋ฅผ ์กฐํํ๋ค.
- ์ฌ๊ธฐ์ ๋ง์ฝ, ์ปค๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ฉด? REPEATABLE READ์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์ด๊ธ๋๊ฒ ๋๋ค.
- ์ฌ์ค ์กฐํํ ์๋ ์๋ค. REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ ์์ ์ ํธ๋์ญ์ ๋ฒํธ๋ณด๋ค ๊ฐ๊ฑฐ๋ ์์ ํธ๋์ญ์ ๋ฒํธ์ ๋ฐ์ดํฐ ๋ง ๋ณผ ์ ์๊ฒ ๋๋ค. (์ค์!)
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ธ๋๋ก๊ทธ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
PHANTOM READ (PHANTOM ROW)
์๋ ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณด์.
- 10๋ฒ ํธ๋์ญ์ ์ด emp_no๊ฐ 50000 ์ด์์ธ ๊ฐ์ ์กฐํํ๊ณ ์๋ค. (1๊ฑด ์กฐํ)
- 12๋ฒ ํธ๋์ญ์ ์ด 50001๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ปค๋ฐ์ ํ๋ค.
- 10๋ฒ ํธ๋์ญ์
์ด ๋๊ฐ์ด SELECT๋ฅผ ํ๋ค.
- ์ด๋ ์๋ ๊ฐ์์ผ๋ฉด ์ธ๋๋ก๊ทธ์ ์๋ ๊ฐ์ ๊ฐ์ ธ์์ ์ด์ ์ฒ๋ผ 1๊ฑด์ ๋ฐ์ดํฐ๋ง ์กฐํํด์์ผ ํ๋ค. ํ์ง๋ง 12๋ฒ ํธ๋์ญ์ ์ด ์ถ๊ฐํ ๋ฐ์ดํฐ๊น์ง ์ด 2๊ฐ์ ์กฐํ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ์ด ๋๋ค.
์ ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ ๊น?
์ธ๋ ๋ ์ฝ๋์๋ ์ ๊ธ์ ๊ฑธ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ SELECT โฆ FOR UPDATE
, SELECT โฆ LOCK IN SHARE MODE
๋ก ์กฐํ๋๋ ๋ ์ฝ๋๋ ์ธ๋ ์์ญ์ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ธํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ฌ ๋ ์ฝ๋์ ๊ฐ(์ ๊ธ ์์ด)์ ๊ฐ์ ธ์ค๊ฒ ๋๋ ๊ฒ์ด๋ค.
SELECT FOR UPDATE vs LOCK IN SHARE MODE
5.4.4 SERIALIZABLE
- ๊ฐ์ฅ ๋จ์ํ๊ณ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
- 4๊ฐ์ง ๊ฒฉ๋ฆฌ์์ค์์ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ์ ์ผ ๋จ์ด์ง๋ค.
- ์์ํ SELECT ์กฐํ๋ ์ ๊ธ์ ๊ฑธ๊ฒ ๋๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋๋ค.
*๋ฌผ๋ก ์์์ ์ค๋ช
ํ SELECT โฆ FOR UPDATE
, SELECT โฆ LOCK IN SHARE MODE
์ฟผ๋ฆฌ๊ฐ์ด ์์ธ์ ์ธ ์ํฉ์ ์ ์ธํ๊ณ ๋ง์ด๋ค.