TL;DR
- ์ถฉ๋ํ๋ ์ฐ์ฐ์ ๋์๊ณผ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก locking, MVCC, OCC์ ์ญํ ๊ตฌ๋ถ
- 2PL์ ๋ฝ ์ ์ง ์๊ฐ๊ณผ predicateยทrange๋ฅผ ํฌํจํ ๋ฝ ๋ฒ์์ ๋ถ๋ฆฌ
- PostgreSQL์ ๋ฒ์ ๊ฐ์์ฑ, ๋์ UPDATE์ ํ ๋ฝ, ์ ํ๋ฆฌ์ผ์ด์ OCC ๊ฒ์ฆ์ ์กฐํฉ
AI-assisted
1. ์ถฉ๋์ ์์ผ๋ก ๋๋๋ค
๊ฒฉ๋ฆฌ ์์ค์ ํ์ฉํ ์ด์ ํ์์ ์ ํ๋ค. ๋์์ฑ ์ ์ด๋ ํธ๋์ญ์ ์คํ์ด ๊ทธ ์กฐ๊ฑด์ ์งํค๋๋ก ์กฐ์ ํ๋ค.
์ถฉ๋์ ํ์์ ์์ผ๋ก ๋๋ ๋ค ์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ์์๋ฅผ ๊ตฌ๋ถํ๋ค.
1๋จ๊ณ: ํ์์ ๊ธฐ์ค
| ํ์์ ์ | ์ถฉ๋ ์กฐ๊ฑด | ์ฒ๋ฆฌํ ๋ฌธ์ |
|---|---|---|
| reader โ reader | ๋ ๋ค ๊ฐ์ ๋ฐ๊พธ์ง ์์ | ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ ์ถฉ๋ ์์ |
| reader โ writer | ์ฝ๋ ๋์ ๊ฐ์ด๋ ๋์ ์งํฉ์ด ๋ฐ๋ | dirty read, non-repeatable read, phantom |
| writer โ writer | ๊ฐ์ ๊ฐ์ ํจ๊ป ๊ฐฑ์ ํจ | lost update, dirty write |
์ฝ๊ธฐ๋ผ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ์ง ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ธ ์ฝ๊ธฐยท์ฐ๊ธฐ ์ถฉ๋์ ๋ง๋ค์ง ์๋๋ค. ๋์์ฑ ์ ์ด๋ ์ฃผ๋ก readerโwriter์ writerโwriter ์ฌ์ด์ ์์๋ฅผ ๋ค๋ฃฌ๋ค.
2๋จ๊ณ: ์ด๋ ์ชฝ์ด ๋จผ์ ์ธ๊ฐ
readerโwriter๋ ์ฐ์ฐ ์์์ ๋ฐ๋ผ ๋ํ๋๋ ๋ฌธ์ ๊ฐ ๋ฌ๋ผ์ง๋ค.
| ์ฐ์ฐ ์์ | ์กฐ๊ฑด | ์ด์ ํ์ |
|---|---|---|
| write โ read | T2๊ฐ T1์ ๋ฏธ์ปค๋ฐ ๊ฐ์ ์ฝ์ | dirty read |
| read โ write | T1์ด ์ฝ์ ํ์ด๋ ์กฐ๊ฑด ๋ฒ์๋ฅผ T2๊ฐ ๋ฐ๊พธ๊ณ T1์ด ๋ค์ ์ฝ์ | non-repeatable read, phantom |
| write โ write | ๋์ด ๊ฐ์ ์ด์ ๊ฐ์ ๋ฐํ์ผ๋ก ๊ฐฑ์ ํ๊ณ ํ์ชฝ ๊ฒฐ๊ณผ๊ฐ ๋ฎ์ | lost update |
๊ฒฉ๋ฆฌ ์์ค๊ณผ ์ด์ ํ์
- Read Committed๋ dirty read๋ฅผ ๋ง๋๋ค
- Repeatable Read๋ ๊ฐ์ ํ์ ๋ค์ ์ฝ์ ๋ ๊ฐ์ด ๋ฐ๋๋ non-repeatable read๋ฅผ ๋ง๋๋ค
- Serializable์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ด๋ค ์ง๋ ฌ ์คํ๊ณผ ๊ฐ๋๋ก ์ ํํ๋ค
- DBMS๋ง๋ค ๊ฐ์ ๊ฒฉ๋ฆฌ ์์ค์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊ณผ ํ์ฉํ๋ ์ธ๋ถ ํ์์ด ๋ค๋ฅผ ์ ์๋ค
์๋จ๋ง๋ค ๋งก๋ ์ญํ ์ด ๋ค๋ฅด๋ค
๊ฐ ์๋จ์ ์ญํ ์ ์ถฉ๋ํ๋ ์ฐ์ฐ์ ๋๊ธฐ, ์ฝ์ ๋ฒ์ ์ ์ ํ, ๋ณ๊ฒฝ์ ๊ฒ์ฆ์ผ๋ก ๋๋๋ค.
| ์๋จ | ์ฃผ๋ ์ญํ | ์ถฉ๋ ์ฒ๋ฆฌ ์์น |
|---|---|---|
| locking | ์ถฉ๋ํ๋ ์ฐ์ฐ์ ๋๊ธฐ์์ผ ์คํ ์์๋ฅผ ์ ํจ | ์ฐ์ฐ ์ ์ด๋ ์คํ ์ค |
| ๋ค์ค ๋ฒ์ ์ ์ฅ | ์ฝ๋ ์ชฝ์ ํ์ํ ์ ๋ฒ์ ์ ๋ณด์กดํจ | ์ฝ๊ธฐ ์์ ์ ๊ฐ์์ฑ ํ์ |
| OCC | ์์ ๋ค ์ฝ์ ๊ฐ์ด๋ ๊ธฐ์ค ๋ฒ์ ์ด ๋ฐ๋์๋์ง ๊ฒ์ฆํจ | ๋ฐ์ ์ง์ |
๊ฐ์ ํ์ ์ ๋ฒ์ ๊ณผ ์ ๋ฒ์ ์ ๋ณด๊ดํด๋ ์ด๋ค ๋ฒ์ ์ ์ฝ์์ง, ๋ ํธ๋์ญ์ ์ด ๋์์ ์์ ํ๋ฉด ์ด๋ ์ชฝ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๊ฑฐ๋ ์คํจ์ํฌ์ง๋ ๋ฐ๋ก ์ ํด์ผ ํ๋ค. MVCC ์๊ณ ๋ฆฌ์ฆ์ ๋ฒ์ ๊ด๋ฆฌ์ ์ด๋ฐ ๊ท์น์ ๊ฒฐํฉํ๋ค.
PostgreSQL์์ A๊ฐ ์์ก์ 1000์์ 900์ผ๋ก ๋ฐ๊พธ๊ณ ์์ง ์ปค๋ฐํ์ง ์์๋ค๊ณ ํ์.
- B๊ฐ ์์ก์ ์กฐํ: ์ผ๋ฐ
SELECT๋ A์ ๋ฏธ์ปค๋ฐ ๊ฐ900์ ์ฝ์ง ์๋๋ค. B์ ์ค๋ ์ท์ ๋ณด์ด๋ ์ด์ ๋ฒ์ ์ด1000์ด๋ฉด A์ ์ปค๋ฐ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ1000์ ์ฝ๋๋ค - B๋ ๊ฐ์ ์์ก์ ๋ณ๊ฒฝ: B์
UPDATE๋ A์ ํธ๋์ญ์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. A๊ฐ ์ปค๋ฐํ๋ฉด Read Committed์์๋ ๋ณ๊ฒฝ๋ ํ์ดWHERE์กฐ๊ฑด์ ์ฌ์ ํ ๋ง์ผ๋ฉด ๊ทธ ํ์ ๊ฐฑ์ ํ๋ค. Repeatable Read์์๋ B์ ์ค๋ ์ท ์ดํ A๊ฐ ๋ณ๊ฒฝํ ํ์ด๋ฉด ์ค๋ฅ๋ก ์ค๋จ๋๋ค
์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ๋ฝ: ํ ์ด๋ธ๊ณผ ํ์ ๊ตฌ๋ถ
- ์ผ๋ฐ ์กฐํ:
SELECT๋ ํ ์ด๋ธ ์์ค์ACCESS SHARE๋ฝ์ ์ก๋๋ค. ์ด ๋ฝ์ ํ ์ด๋ธ ์ญ์ ๊ฐ์ ์์ ๊ณผ ์ถฉ๋ํ์ง๋งUPDATE์ ํ ์ด๋ธ ๋ฝ๊ณผ๋ ํจ๊ป ์ ์งํ ์ ์๋ค- ํ ๋ณ๊ฒฝ:
UPDATE๋ ๋ณ๊ฒฝํ๋ ํ์๋ ๋ฝ์ ์ก๋๋ค. ์ผ๋ฐSELECT๋ ์ด ํ ๋ฝ์ ์์ฒญํ์ง ์์ผ๋ฏ๋ก ์กฐํ์ ๋ณ๊ฒฝ์ ์๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค. ๊ฐ์ ํ์ ๋ณ๊ฒฝํ๋ ค๋ ๋ค๋ฅธUPDATE๋ ๊ธฐ๋ค๋ฆฐ๋ค- ์ ๊ธ ์กฐํ:
SELECT FOR UPDATE์ฒ๋ผ ๋ช ์์ ์ผ๋ก ํ ๋ฝ์ ์์ฒญํ๋ ์กฐํ๋ ์ผ๋ฐSELECT์ ๋ฌ๋ฆฌ ๋๊ธฐํ ์ ์๋ค
2. ๋น๊ด์ : ๋ฝ์ผ๋ก ๋ง๋๋ค
์ฌ์ฉ์๋ค์ด ๋์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์
๋น๊ด์ ๋ฐฉ์์ ์ฐ์ฐ ์ ์ ๋ฝ์ ์ก์ ๊ฐ์ ๋์์ ์ถฉ๋ํ๋ ์ฐ์ฐ์ ๋๊ธฐ์ํจ๋ค.
- ๊ณต์ ๋ฝ(shared, S): ์ฝ์ ๋ ์ก๋๋ค. ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์ก์ ์ ์๋ค
- ๋ฐฐํ ๋ฝ(exclusive, X): ์ธ ๋ ์ก๋๋ค. ํ๋๋ง ์ก์ ์ ์๊ณ ๊ฐ์ ๋์์ ๊ณต์ ๋ฝ๊ณผ๋ ๊ณต์กดํ์ง ๋ชปํ๋ค
| ๋ณด์ ์ค \ ์์ฒญ | S ์์ฒญ | X ์์ฒญ |
|---|---|---|
| S ๋ณด์ | ํ์ฉ | ๋๊ธฐ |
| X ๋ณด์ | ๋๊ธฐ | ๋๊ธฐ |
๊ฐ์ ๋์์ S/X๋ฝ์ด ์ถฉ๋ํ๋ฉด ์์ฒญํ ์ฐ์ฐ์ด ๋๊ธฐํ๋ค. ์ด ํธํ์ฑ ๊ท์น์ ๋ฝ์ ์ ์งํ๋ ์๊ฐ๊ณผ ์ ๊ทธ๋ ๋ฒ์๋ฅผ ๋ํด์ผ ์ํ๋ ๊ฒฉ๋ฆฌ ์์ค์ ๋ง๋ค ์ ์๋ค.
๋ฝ์ ๋จ์: ํ๋ถํฐ ํ ์ด๋ธ๊น์ง
- ํ ๋ฝ์ ์๋ก ๋ค๋ฅธ ํ์ ์์ ์ ํจ๊ป ์คํํ ์ ์์ง๋ง ๋ฝ์ ๊ด๋ฆฌํ๋ ๋น์ฉ์ด ๋ ๋ค
- ์ผ๋ถ DBMS๋ ๋ง์ ํ ๋ฝ์ ํ์ด์ง๋ ํ ์ด๋ธ ๋ฝ์ผ๋ก ์น๊ธํ๋ค
- PostgreSQL์ ํ ๋ฝ ์ ๋ณด๋ฅผ ํํ ํค๋์ ๊ธฐ๋กํ๋ฉฐ ํ ๋ฝ ์๊ฐ ๋์ด๋ ํ ์ด๋ธ ๋ฝ์ผ๋ก ์น๊ธํ์ง ์๋๋ค
- PostgreSQL์ ๋ฝ ์ข ๋ฅ๋ ํ ์ด๋ธ ๋จ์์ ํ ๋จ์๋ก ๋๋๋ค
2PL: ๋ฝ์ ์ธ์ ๋๋๋
๋ฝ ํธํ์ฑ๋ง์ผ๋ก๋ ์ง๋ ฌ์ฑ์ ๋ณด์ฅํ์ง ๋ชปํ๋ค. ๋ฝ์ ์ก์๋ค ๋ฐ๋ก ๋๋ ์์ ์ ๋ฐ๋ณตํ๋ฉด ๊ฐ๋ณ ์ถฉ๋์ ๊ฒน์น์ง ์์๋ ์ ์ฒด ์คํ ๊ฒฐ๊ณผ๊ฐ ์ง๋ ฌ ์คํ๊ณผ ๋ฌ๋ผ์ง ์ ์๋ค.
๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋ณต์ฌํ๋ ์๋ฅผ ๋ณธ๋ค. ์ด๊ธฐ๊ฐ์ A=1, B=2๋ค.
- T1: A๋ฅผ ์ฝ์ด B์ ์ด๋ค
- T2: B๋ฅผ ์ฝ์ด A์ ์ด๋ค
๋ ํธ๋์ญ์ ์ ํ๋์ฉ ์คํํ๋ฉด ๊ฒฐ๊ณผ๋ ๋ค์ ๋ ์ค ํ๋๋ค.
| ์ง๋ ฌ ์์ | ์คํ | ๊ฒฐ๊ณผ |
|---|---|---|
| T1 โ T2 | B=1๋ก ๋ฐ๊พผ ๋ค T2๊ฐ B๋ฅผ ์ฝ์ด A=1๋ก ๋ณ๊ฒฝ | A=1, B=1 |
| T2 โ T1 | A=2๋ก ๋ฐ๊พผ ๋ค T1์ด A๋ฅผ ์ฝ์ด B=2๋ก ๋ณ๊ฒฝ | A=2, B=2 |
๋ฝ์ ๋งค ์ฐ์ฐ ์งํ ํด์ ํ๋ฉฐ ๊ต์ฐจ ์คํํ๋ฉด ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
T1 S(A) r(A)=1 ํด์
T2 S(B) r(B)=2 ํด์
T1 X(B) w(B)=1 ํด์
T2 X(A) w(A)=2 ํด์
๊ฒฐ๊ณผ A=2, B=1๋ ํธ๋์ญ์ ์ ๋ชจ๋ ์๋๊ฐ ์ฐ๊ธฐ ์ ์ ๊ฐ์ ์ฝ์ด ๊ณ์ฐํ๋ค. A์ ์ถฉ๋ ์์๋ T1โT2์ด๊ณ B์ ์ถฉ๋ ์์๋ T2โT1์ด๋ฏ๋ก ํ๋์ ์ง๋ ฌ ์์๋ก ์ค๋ช ํ ์ ์๋ค.
2PL(two-phase locking)์ ๋ฝ ํ๋๊ณผ ํด์ ์์๋ฅผ ์ ํํ๋ค.
- Expanding phase: ๋ฝ์ ํ๋๋ง ํ๊ณ ํด์ ํ์ง ์๋๋ค
- Shrinking phase: ๋ฝ์ ํด์ ๋ง ํ๊ณ ์ ๋ฝ์ ํ๋ํ์ง ์๋๋ค
ํ ๋ฒ์ด๋ผ๋ ๋ฝ์ ํด์ ํ ๋ค์๋ ์ ๋ฝ์ ํ๋ํ ์ ์๋ค. ์ ์์์์ ๋ ํธ๋์ญ์ ์ด ํ์ํ S๋ฝ์ ๊ณ์ ๋ณด์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ํธ ๋๊ธฐ๊ฐ ์๊ธด๋ค.
T1 S(A) ํ๋ โ r(A) โ X(B) ์์ฒญ ยทยทยท ๋๊ธฐ B๋ T2๊ฐ S๋ฝ ๋ณด์ ์ค
T2 S(B) ํ๋ โ r(B) โ X(A) ์์ฒญ ยทยทยท ๋๊ธฐ A๋ T1์ด S๋ฝ ๋ณด์ ์คDBMS๋ ์ด ์ํ์ ๋ฐ๋๋ฝ์ผ๋ก ๊ฐ์งํ๊ณ ํ์ชฝ ํธ๋์ญ์ ์ ์ค๋จํ๋ค. ์ค๋จ๋ ์์ ์ ๋ค์ ์ฒ๋ฆฌํ๋ ค๋ฉด ํธ๋์ญ์ ์ ์ฌ์๋ํ๋ค.
๋ฝ ํธํ์ฑ๊ณผ 2PL์ ์ญํ
- S/X ํธํ์ฑ: ๊ฐ์ ๋ ผ๋ฆฌ์ ๋์์ ์ถฉ๋ํ๋ ์ฐ์ฐ์ ๋๊ธฐ์ํจ๋ค
- 2๋จ๊ณ ๊ท์น: ๊ด๋ จ ๋ ผ๋ฆฌ์ ๋์์ ๋ชจ๋ ์ ๊ทผ ์ค์ผ์ค์ conflict serializableํ๊ฒ ๋ง๋ ๋ค
- ์ ์ฉ ์ฃผ์ฒด: ๊ฐ ํธ๋์ญ์ ์ด ์์ ์ด ํ๋ํ๊ณ ํด์ ํ๋ ๋ฝ์ ๊ท์น์ ์ ์ฉํ๋ค
- ๋ฐ๋๋ฝ: 2PL๋ ์๋ก ๋ค๋ฅธ ์์๋ก ๋ฝ์ ์ก์ผ๋ฉด ์ํ์ด ์๊ธธ ์ ์๋ค
์ฃผ์: ๋ฐ๋๋ฝ ์ฒ๋ฆฌ
- T1์ด A๋ฅผ ์ก๊ณ B๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ T2๊ฐ B๋ฅผ ์ก๊ณ A๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ ๋ค ์๋๊ฐ ๋ฝ์ ํด์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค
- DBMS๋ ๋๊ธฐ ๊ทธ๋ํ์ ์ํ์ ์ฐพ์ ํ์ชฝ ํธ๋์ญ์ ์ ์ค๋จํ๋ค
- ์์์ ๊ฐ์ ์์๋ก ์ ๊ทธ๋ฉด ์ด ํํ์ ์ํ์ ํผํ ์ ์๋ค. ๊ณ์ข ์ด์ฒด๋ผ๋ฉด
id๊ฐ ์์ ๊ณ์ข๋ถํฐ ์ ๊ทผ๋ค- PostgreSQL์
deadlock_timeout์ดํ ๋ฐ๋๋ฝ ๊ฒ์ฌ๋ฅผ ์์ํ๋ค
ํ๋ โโโโโโโโโโโโบโโโโโโโโโโโโโ ํด์
โ
Expanding phase โ Shrinking phase
โ
lock pointLock point๋ ํธ๋์ญ์ ์ด ๋ง์ง๋ง ๋ฝ์ ํ๋ํ ์์ ์ด๋ค. ๊ฐ ํธ๋์ญ์ ์ lock point ์์๋ก ์ง๋ ฌ ์์๋ฅผ ์ ํ ์ ์๋ค. ๊ด๋ จ๋ ๋ชจ๋ ๋ ผ๋ฆฌ์ ๋์์ ํธํ ๋ฝ์ ์ ์ฉํ 2PL ์ค์ผ์ค์ conflict serializableํ๋ค.
ํ ๋ฝ๊ณผ phantom
| ์ถฉ๋ | ๊ฐ์ ํ์ ๊ฑด ๋ฝ์ ์ฒ๋ฆฌ | ์ถ๊ฐ๋ก ํ์ํ ๋ฒ์ |
|---|---|---|
| write โ write | X๋ฝ๋ผ๋ฆฌ ์ถฉ๋ํด ๋ค์ชฝ์ด ๋๊ธฐ | ๊ฐ์ ํ |
| write โ read | X๋ฝ๊ณผ S๋ฝ์ด ์ถฉ๋ํด ์ฝ๋ ์ชฝ์ด ๋๊ธฐ | ๊ฐ์ ํ |
| read โ write | S๋ฝ๊ณผ X๋ฝ์ด ์ถฉ๋ํด ์ฐ๋ ์ชฝ์ด ๋๊ธฐ | ๊ฐ์ ํ ๋๋ ์กฐ๊ฑด ๋ฒ์ |
S๋ฝ์ ๊ณ์ ๋ณด์ ํ๋ฉด ๊ฐ์ ํ์ ๊ฐ์ด ๋ฐ๋๋ ๊ฒ์ ๋ง๋๋ค. S๋ฝ์ ํด์ ํ ๋ค ๊ฐ์ ํ์ ๋ค์ ์ฝ์ผ๋ ค๋ฉด ์ S๋ฝ์ด ํ์ํ์ง๋ง shrinking phase์์๋ ์ ๋ฝ์ ํ๋ํ ์ ์๋ค.
์กฐ๊ฑด์ ๋ง๋ ํ ์งํฉ์ ๋ค์ ์ฝ๋ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด ํ์ ๋ฝ๋ง์ผ๋ก ๋ถ์กฑํ๋ค.
T1 SELECT count(*) WHERE age > 30 โ 10๊ฑด. ๊ธฐ์กด 10ํ์ S๋ฝ
T2 INSERT age = 35 โ ๊ธฐ์กด ํ ๋ฝ๊ณผ ์ถฉ๋ํ์ง ์์
T1 SELECT count(*) WHERE age > 30 โ 11๊ฑดT1์ด ๊ธฐ์กด ํ์ S๋ฝ์ ๊ณ์ ๋ณด์ ํด๋ ์ ํ์ด ์กฐ๊ฑด ๋ฒ์์ ๋ค์ด์ฌ ์ ์๋ค. ํ ๋ฝ๋ง ์ฌ์ฉํ๋ฉด ์ด phantom์ ๋ง์ง ๋ชปํ๋ค.
phantom ๋ฐฉ์ง: ์กฐ๊ฑด ๋ฒ์์ ๋ณ๊ฒฝ ์ฒ๋ฆฌ
- predicate lock: ์กฐ๊ฑด์ด ๊ฐ๋ฆฌํค๋ ๋ ผ๋ฆฌ์ ์งํฉ์ ์ ๊ทผ๋ค
- index range lock: ์ธ๋ฑ์ค ๊ฐ ์ฌ์ด์ ๋ฒ์๋ฅผ ์ ๊ทผ๋ค. MySQL InnoDB์ gap lock์ด ์ด ๋ฐฉ์์ ์ํ๋ค
- SSI: ์ฝ์ ๋ฒ์๋ฅผ ๊ธฐ๋กํ๊ณ ์ํํ ์ฝ๊ธฐยท์ฐ๊ธฐ ์์กด์ ๊ฐ์งํ๋ค. PostgreSQL Serializable์ด ์ด ๋ฐฉ์์ ์ด๋ค
- ๊ตฌ๋ถ ๊ธฐ์ค: 2PL ๋ณํ์ ๋ฝ์ ์ ์ง ์๊ฐ์ ์ ํ๋ค. phantom ๋ฐฉ์ง๋ ์ด๋ค ๋ ผ๋ฆฌ์ ๋ฒ์๊น์ง ์ฒ๋ฆฌํ๋์ง์ ๋ฌ๋ ค ์๋ค
2PL ๋ณํ
| ๋ณํ | ๋ฝ ํ๋ยทํด์ ๊ท์น | ์ง๋ ฌ์ฑ | ๋ฐ๋๋ฝ | ๋ณต๊ตฌ ํน์ฑ |
|---|---|---|---|---|
| ๊ธฐ๋ณธ 2PL | lock point ์ดํ | conflict serializable | ์๊ธธ ์ ์์ | recoverable์ ๋ณด์ฅํ์ง ์์ |
| Conservative 2PL | ํ์ํ ๋ฝ์ ์์ ์ ์ ๋ชจ๋ ํ๋ | conflict serializable | ๋ฝ ํ๋ ์ํ ์์ | ํด์ ๊ท์น์ ๋ฐ๋ผ ๋ฌ๋ผ์ง |
| Strict 2PL (S2PL) | X๋ฝ์ ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง ์ ์ง | conflict serializable | ์๊ธธ ์ ์์ | strict |
| Strong Strict 2PL (SS2PL) | S๋ฝ๊ณผ X๋ฝ์ ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง ์ ์ง | conflict serializable | ์๊ธธ ์ ์์ | strict |
recoverable๊ณผ strict
- recoverable: ์ฝ์ ๊ฐ์ ๋ง๋ ํธ๋์ญ์ ์ด ๋จผ์ ์ปค๋ฐํ ๋ค ์ด๋ฅผ ์ฝ์ ํธ๋์ญ์ ์ด ์ปค๋ฐํ๋ค
- cascadeless: ์ปค๋ฐํ ๊ฐ๋ง ์ฝ์ด ์ฐ์ ๋กค๋ฐฑ์ ํผํ๋ค
- strict: ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ฏธ์ปค๋ฐ ๊ฐ์ ์ฝ๊ฑฐ๋ ๋ฎ์ด์ฐ์ง ์๋๋ค
- ํฌํจ ๊ด๊ณ๋
strict โ cascadeless โ recoverable์ด๋ค
- Conservative 2PL: ์์ ์ ์ ํ์ํ ๋ฝ ์งํฉ์ ์์์ผ ํ๋ค. ์คํ ์ค ํ์ํ ๋์์ด ๋ฌ๋ผ์ง๋ ์์ ์๋ ์ ์ฉํ๊ธฐ ์ด๋ ต๋ค
- Strict 2PL: X๋ฝ์ ์ข ๋ฃ๊น์ง ์ ์งํด ๋ฏธ์ปค๋ฐ ๊ฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๊ฑฐ๋ ๋ฎ์ด์ฐ์ง ๋ชปํ๊ฒ ํ๋ค
- Strong Strict 2PL: S๋ฝ๊ณผ X๋ฝ์ ์ข ๋ฃ๊น์ง ์ ์งํ๋ค. ์ปค๋ฐ ์์๊ฐ serialization order์ ์ผ์นํ๋ค
PostgreSQL์ SELECT ... FOR UPDATE๊ฐ ํ๋ํ ํ ๋ฝ์ ํธ๋์ญ์
์ด ๋๋ ๋๊น์ง ์ ์ง๋๋ค.
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- ํ ๋ฝ ํ๋
UPDATE accounts SET balance = 500 WHERE id = 1;
COMMIT; -- ํ ๋ฝ ํด์ ๋ฝ ๊ธฐ๋ฐ ๊ฒฉ๋ฆฌ ์์ค
๋ค์ ํ๋ Berenson ๋ฑ์ ๋ ผ๋ฌธ์ ๋ฝ ๊ธฐ๋ฐ ๊ฒฉ๋ฆฌ ์์ค ๋ชจ๋ธ์ด๋ค.
| ๊ฒฉ๋ฆฌ ์์ค | write lock | data-item read lock | predicate read lock | ๋ฐฉ์งํ๋ ํ์ |
|---|---|---|---|---|
| Read Uncommitted | ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง | ์์ | ์์ | dirty write |
| Read Committed | ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง | ์ฝ๋ ๋์ | ์ฝ๋ ๋์ | dirty read |
| Repeatable Read | ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง | ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง | ์ฝ๋ ๋์ | non-repeatable read |
| Serializable | ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง | ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง | ์ปค๋ฐยท๋กค๋ฐฑ๊น์ง | phantom์ ํฌํจํ ๋น์ง๋ ฌ ์คํ |
์ด ๋ชจ๋ธ์์ Repeatable Read์ Serializable์ ์ฐจ์ด๋ predicate read lock์ ์ ์งํ๋ ์๊ฐ์ด๋ค. ์ค์ DBMS์ ๊ฒฉ๋ฆฌ ์์ค์ MVCC, ๋ฝ, ์์กด ์ถ์ ์ ์กฐํฉํด ๊ตฌํํ ์ ์๋ค.
3. MVCC: ์ฝ๊ธฐ๋ฅผ ๋ง์ง ์๋๋ค
MVCC(Multiversion Concurrency Control)๋ ์ฝ๋ ์ชฝ์ ํ์ํ ์ ๋ฒ์ ์ ๋ณด์กดํ๊ณ ์ค๋ ์ท์ ๋ง๋ ๋ฒ์ ์ ์ ํํ๋ค. ๋ฒ์ ์ ์ ์ฅํ๋ ๋ฌผ๋ฆฌ ๋ฐฉ์์ DBMS๋ง๋ค ๋ค๋ฅด๋ค.
PostgreSQL์ UPDATEํ ๋ ์ ํํ์ ๋จ๊ธฐ๊ณ ์ ํํ์ ๋ง๋ ๋ค.
| ๋ฒ์ | balance | ์ํ |
|---|---|---|
| ๋ฒ์ 1 | 1000 | T10์ด ๋ง๋ค๊ณ T20์ด ๊ฐฑ์ ๋์์ผ๋ก ํ์ |
| ๋ฒ์ 2 | 500 | T20์ด ์๋ก ๋ง๋ฆ |
์ฝ๋ ์ชฝ์ ์ฟผ๋ฆฌ์ ์ค๋
์ท์ ๋ณด์ด๋ ๋ฒ์ ์ ๊ณ ๋ฅธ๋ค. PostgreSQL Read Committed๋ ๋ฌธ์ฅ๋ง๋ค ์ ์ค๋
์ท์ ์ฌ์ฉํ๋ค. Repeatable Read์ Serializable์ BEGIN ๋ค ์ฒซ ์กฐํยท๋ณ๊ฒฝ ๋ฌธ์ฅ์์ ์ป์ ์ค๋
์ท์ ํธ๋์ญ์
๋์ ์ฌ์ฉํ๋ค.
์ผ๋ฐ ์กฐํ์ ๊ฐฑ์ ์ ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ์ฌ์ฉํ๋ฏ๋ก ๋ณดํต ์๋ก ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค.
PostgreSQL์ ๊ตฌํ
๊ฐ ํํ์๋ ํธ๋์ญ์ ID๋ฅผ ๊ธฐ๋กํ๋ ํ๋๊ฐ ์๋ค.
xmin: ์ด ๋ฒ์ ์ ๋ง๋ ํธ๋์ญ์ IDxmax: ์ด ๋ฒ์ ์ ์ง์ฐ๊ฑฐ๋ ์ ๊ทผ ํธ๋์ญ์ ID. ์๋ฌด๋ ์๋์ง ์์์ผ๋ฉด0
SELECT xmin, xmax, * FROM accounts WHERE id = 1;SQL ๋ฌธ์ฅ๋ง๋ค xmin๊ณผ xmax์ ๊ธฐ๋กํ๋ ๊ฐ์ด ๋ค๋ฅด๋ค.
| ๋ฌธ์ฅ | xmin | xmax |
|---|---|---|
INSERT | ์ ํํ์ ์๊ธฐ XID | ๋ณ๊ฒฝํ์ง ์์ |
UPDATE | ์ ํํ์ ์๊ธฐ XID | ์ ํํ์ ์๊ธฐ XID |
DELETE | ๋ณ๊ฒฝํ์ง ์์ | ์ ํํ์ ์๊ธฐ XID |
SELECT ... FOR UPDATE | ๋ณ๊ฒฝํ์ง ์์ | ์ ๊ธ ์ ๋ณด๋ฅผ ๊ธฐ๋ก |
INSERT๋ ์ ํํ์ ๋ง๋ ๋ค. PostgreSQL์ UPDATE๋ ์ ํํ์ xmax๋ฅผ ๊ธฐ๋กํ๊ณ ์ ๊ฐ์ ๊ฐ์ง ํํ์ ์ถ๊ฐํ๋ค.
์ฃผ์:
xmax์ ๊ฐ์์ฑ
- PostgreSQL system columns์ ๋ณด์ด๋ ํํ์
xmax๋ 0์ด ์๋ ์ ์๋ค๊ณ ์ค๋ช ํ๋คxmax์ ํธ๋์ญ์ ์ด ์์ง ์ปค๋ฐํ์ง ์์๊ฑฐ๋ ๋กค๋ฐฑํ์ ์ ์๋ค- ํ ์ญ์ ๊ฐ ์๋๋ผ ํ ์ ๊ธ์ ๊ธฐ๋กํ ๊ฐ์ผ ์ ์๋ค
- ๊ฐ์์ฑ์
xmax์ ๊ฐ๋ง์ผ๋ก ์ ํ์ง ์๊ณ ํธ๋์ญ์ ์ํ์ ์ค๋ ์ท์ ํจ๊ป ํ์ธํ๋ค
ํ ๋ฝ ์ ๋ณด์ ์ ์ฅ ์์น
- PostgreSQL์ ํ ๋ฝ ์ ๋ณด๋ฅผ ํํ ํค๋์
t_xmax์ ๊ธฐ๋กํ๋ค- ์ญ์ ์ ์ ๊ธ์
t_infomask๋ฑ์ ์ํ ๋นํธ๋ก ๊ตฌ๋ถํ๋คSELECT ... FOR UPDATE๋ ๋์ ํํ์ ์ ๊ธ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ ์ ์๋ค- PostgreSQL์ ํ ๋ฝ ์๊ฐ ๋์ด๋ ํ ์ด๋ธ ๋ฝ์ผ๋ก ์น๊ธํ์ง ์๋๋ค
ํํ ํ๋์ ํธ๋์ญ์ ์ํ
ํํ์ xmin๊ณผ xmax๋ SQL ๋ฌธ์ฅ์ ์คํํ ๋ ๊ธฐ๋ก๋๋ค.
BEGIN;
UPDATE accounts SET balance = 500 WHERE id = 1;
-- ์ ํํ์ xmax์ ์ ํํ์ xmin์ ํ์ฌ XID๊ฐ ๊ธฐ๋ก๋๋ค
COMMIT;pg_xact๋ ํธ๋์ญ์
์ ์ปค๋ฐ ์ํ๋ฅผ ์ ์ฅํ๋ค. PostgreSQL์ ์ปค๋ฐํ ๋ ์์ ํ ํํ๋ง๋ค ์ปค๋ฐ ์ฌ๋ถ๋ฅผ ๋ค์ ๊ธฐ๋กํ์ง ์๊ณ ํธ๋์ญ์
์ํ๋ฅผ ์ฌ์ฉํด ๊ฐ์์ฑ์ ํ์ ํ๋ค. ์ปค๋ฐ๊ณผ ๋กค๋ฐฑ์ ์ ์ฒด ๋น์ฉ์๋ WAL ๊ธฐ๋ก๊ณผ ๋ฝยท์์ ์ ๋ฆฌ ๋น์ฉ๋ ํฌํจ๋๋ค.
| ์์น | ์ ์ฅ ๋ด์ฉ | ๊ธฐ๋ก ์์ |
|---|---|---|
ํํ์ xminยทxmax | ํํ์ ๋ง๋ XID์ ์ญ์ ยท์ ๊ธํ XID | ๋ฌธ์ฅ ์คํ ์ค |
pg_xact | ํธ๋์ญ์ ์ ์ปค๋ฐ ์ํ | ์ปค๋ฐยท๋กค๋ฐฑ ์ฒ๋ฆฌ ์ค |
๋กค๋ฐฑํ ํธ๋์ญ์
์ด ๋ง๋ ํํ์ ์กฐํ ๋์์์ ์ ์ธ๋๊ณ VACUUM์ผ๋ก ํ์๋๋ค. InnoDB๋ undo log๋ฅผ ์ญ์์ผ๋ก ์ ์ฉํด ๋ณ๊ฒฝ์ ๋๋๋ฆฐ๋ค.
hint bit: ์ฝ๊ธฐ๊ฐ ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค
- ๊ฐ์์ฑ์ ํ์ธํ backend๋ ํธ๋์ญ์ ์ํ๋ฅผ ํํ์ hint bit์ ๊ธฐ๋กํ ์ ์๋ค
- hint bit๋ฅผ ๊ธฐ๋กํ๋ฉด ์กฐํ ์ค์๋ ๋ฐ์ดํฐ ํ์ด์ง๊ฐ dirty ์ํ๊ฐ ๋ ์ ์๋ค
- ๋ฐ์ดํฐ checksum์ ์ฌ์ฉํ๊ฑฐ๋
wal_log_hints=on์ด๋ฉด checkpoint ์ดํ ํ์ด์ง์ ์ฒซ ๋ณ๊ฒฝ์์ full-page image๊ฐ WAL์ ๊ธฐ๋ก๋ ์ ์๋ค- ์กฐํ ์๊ฐ์๋ hint bit ๊ธฐ๋ก ๋น์ฉ ์ธ์ ์บ์ ์ํ์ ๋์์ ์คํ ์ค์ธ ์์ ๋ ์ํฅ์ ์ค๋ค
์ฃผ์: dead tuple๊ณผ VACUUM
- ๋๋ ๋ณด์ด์ง ์๋ ์ ๋ฒ์ ์ dead tuple์ด๋ผ๊ณ ํ๋ค. ํ์ํ์ง ์์ผ๋ฉด ๋์คํฌ๋ฅผ ์ฐจ์งํ๊ณ ์ค์บ ๋น์ฉ์ ์ํฅ์ ์ค ์ ์๋ค
VACUUM์ด ์ฌ์ฌ์ฉํ ์ ์๋ ๊ณต๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ค- ์ค๋ ์ ์งํ ์ค๋ ์ท์ ํ์ํ ์ ๋ฒ์ ์
VACUUM์ด ํ์ํ ์ ์๋ค- ๋ถํ์์ ์ค์ ํฌ๊ธฐ์ ์์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํด ํ์ธํ๋ค. ํ์ํ ๊ฒฝ์ฐ
VACUUM FULL์ด๋ ํ ์ด๋ธ ์ฌ์์ฑ์ ๊ฒํ ํ๋ค- ์ฐธ๊ณ : https://techblog.woowahan.com/9478/ (PostgreSQL MVCC, Vacuum์ ๋ํด ์ ๋ฆฌ๋ ๋งค์ฐ ์ข์ ๊ธ)
readerโwriter ์ถฉ๋
๋ค๋ฅธ ํธ๋์ญ์
์ด ๋ง๋ ๋ฒ์ ์ ์ฝ์ ๋๋ ์ค๋
์ท์ ๋ณด์ด๋ ์ปค๋ฐ ์ํ์ xminยทxmax๋ฅผ ํจ๊ป ํ์ธํ๋ค. ์์ ์ ํธ๋์ญ์
์ด ๋ง๋ ๋ฏธ์ปค๋ฐ ๋ณ๊ฒฝ์ ๊ฐ์ ํธ๋์ญ์
์์์ ์ฝ์ ์ ์๋ค.
write โ read: T20์ด ์ฐ๋ ๋์ T21์ด ์ฝ๋ ๊ฒฝ์ฐ๋ค. ์ด๊ธฐ๊ฐ balance = 1000์ T10์ด ๋ง๋ ๋ฒ์ ์ด๋ค.
T20 (์ฐ๋ ์ชฝ) T21 (์ฝ๋ ์ชฝ)
----------------------------- -----------------------------
BEGIN
UPDATE balance = 500
BEGIN
SELECT balance --> 1000
ROLLBACK
SELECT balance --> 1000UPDATE ์งํ ํ์ ๋ค์ ์ํ๋ค.
| ๋ฒ์ | xmin | xmax | balance | ์ํ |
|---|---|---|---|---|
| ๋ฒ์ 1 | 10 | 20 | 1000 | T20์ด ๊ฐฑ์ ๋์์ผ๋ก ํ์ํ์ผ๋ ๋ฏธ์ปค๋ฐ |
| ๋ฒ์ 2 | 20 | - | 500 | T20์ด ๋ง๋ค์์ผ๋ ๋ฏธ์ปค๋ฐ |
T21์ ๋ค๋ฅธ ํธ๋์ญ์
์ ๋ฏธ์ปค๋ฐ ๋ฒ์ 2๋ฅผ ๊ฑด๋๋ด๋ค. ๋ฒ์ 1์ xmax=20๋ ๋ฏธ์ปค๋ฐ์ด๋ฏ๋ก ๋ฒ์ 1์ ์์ง ์ญ์ ๋์ง ์์ ๊ฒ์ผ๋ก ํ์ ํ๊ณ 1000์ ์ฝ๋๋ค. T20์ด ๋กค๋ฐฑํ๋ฉด ๋ฒ์ 2๋ ์ดํ VACUUM์ ํ์ ๋์์ด ๋๋ค.
read โ write: T30์ด Repeatable Read์์ ์ฝ๋ ๋์ T31์ด ์ฐ๋ ๊ฒฝ์ฐ๋ค.
T30 (์ฝ๋ ์ชฝ, RR) T31 (์ฐ๋ ์ชฝ)
----------------------------- -----------------------------
BEGIN
SELECT balance --> 1000
BEGIN
UPDATE balance = 500
COMMIT
SELECT balance --> 1000
COMMIT
SELECT balance --> 500T30์ ์ฒซ SELECT์์ ์ค๋
์ท์ ์ป๋๋ค. ๊ทธ ๋ค T31์ด ๋ง๋ค๊ณ ์ปค๋ฐํ ๋ฒ์ ์ T30์ ์ค๋
์ท์ ๋ณด์ด์ง ์์ผ๋ฏ๋ก T30์ ๋ ๋ฒ์งธ SELECT๋ 1000์ ์ฝ๋๋ค.
| ์ถฉ๋ | ๋ฝ ๊ธฐ๋ฐ ์ฝ๊ธฐ | MVCC ์ฝ๊ธฐ |
|---|---|---|
| write โ read | ์ฝ๋ ์ชฝ์ด ๊ฐ์ ๋์์ X๋ฝ ์์์ ๋๊ธฐ | ๋ณด์ด๋ ์ ๋ฒ์ ์ ์ฝ์ |
| read โ write | ์ฐ๋ ์ชฝ์ด ๊ฐ์ ๋์์ S๋ฝ ์์์ ๋๊ธฐ | ์ ๋ฒ์ ์ ๋ง๋ค ์ ์์ |
PostgreSQL์ ์ค๋ ์ท ์์
- Read Committed: ๋ฌธ์ฅ๋ง๋ค ์ ์ค๋ ์ท์ ์ฌ์ฉํ๋ค. ์ ์์๋ผ๋ฉด T30์ ๋ ๋ฒ์งธ
SELECT๊ฐ500์ ์ฝ๋๋ค- Repeatable Read:
BEGIN๋ค ์ฒซ ์กฐํยท๋ณ๊ฒฝ ๋ฌธ์ฅ์์ ์ป์ ์ค๋ ์ท์ ํธ๋์ญ์ ๋์ ์ฌ์ฉํ๋ค- Serializable: Repeatable Read์ ๊ฐ์ ์ค๋ ์ท ๊ท์น์ SSI์ ์์กด ์ถ์ ์ ๋ํ๋ค
- PostgreSQL์์๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ฏธ์ปค๋ฐ ๋ณ๊ฒฝ์ ์ฝ์ง ์๋๋ค
psql ์ฐฝ ๋ ๊ฐ๋ก ์ฌํ
-- ์ฐฝ 1 BEGIN; UPDATE accounts SET balance = 500 WHERE id = 1; -- ์ปค๋ฐํ์ง ์๊ณ ๋๋ค -- ์ฐฝ 2 SELECT balance FROM accounts WHERE id = 1; -- ์ฆ์ ์๋ต. ์ ๊ฐ SELECT xmin, xmax, balance FROM accounts WHERE id = 1;
- ์ฐฝ 2๊ฐ ๊ธฐ๋ค๋ฆฌ์ง ์๋์ง ํ์ธํ๋ค
SELECT ... FOR UPDATE๋ก ๋ฐ๊พธ๋ฉด ์กฐํํ ํ์ ์ ๊ทธ๋ฏ๋ก ์์ ๊ฐฑ์ ์ ํ ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค
writerโwriter ์ถฉ๋ : PostgreSQL์ ๋์ UPDATE
๋ค์ค ๋ฒ์ ์ ์ฅ๋ง์ผ๋ก๋ ๋ ๊ฐฑ์ ์ ์์๋ฅผ ์ ํ์ง ๋ชปํ๋ค.
T40 T41
----------------------------- -----------------------------
BEGIN
UPDATE balance = 500
BEGIN
UPDATE balance = 300
... ๋๊ธฐ ...
COMMIT
(์ฌ๊ฐ)PostgreSQL์ ๋ ๋ฒ์งธ UPDATE๋ ๊ฐ์ ํ์ ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. Read Committed์์๋ ๋๊ธฐ ๋ค ๊ฒ์ ์กฐ๊ฑด์ ๋ค์ ํ๊ฐํ ์ ์๊ณ Repeatable Read์์๋ ๋์ ๋ณ๊ฒฝ ๋๋ฌธ์ serialization failure๊ฐ ๋ ์ ์๋ค.
DBMS๋ณ ์ ๋ฒ์ ์ ์ฅ ์์น
| DBMS | ์ต์ ๋ฒ์ | ์ ๋ฒ์ |
|---|---|---|
| PostgreSQL | ์ ํํ์ ํ ์ด๋ธ์ ์ถ๊ฐ | ์ ํํ์ ํ ์ด๋ธ์ ์ ์ง |
| MySQL InnoDB | ํ์ฌ ๋ ์ฝ๋๋ฅผ ๊ฐฑ์ | undo log์ ๊ธฐ๋ก |
| Oracle | ํ์ฌ ๋ ์ฝ๋๋ฅผ ๊ฐฑ์ | undo segment์ ๊ธฐ๋ก |
InnoDB์ Oracle์ undo ์ ๋ณด๋ฅผ ์ฌ์ฉํด ์ค๋ ์ท์ ํ์ํ ์ ๋ฒ์ ์ ์ฌ๊ตฌ์ฑํ๋ค. PostgreSQL์ ํ ์ด๋ธ ์์ ์ฌ๋ฌ ํํ ๋ฒ์ ์์ ๊ฐ์์ฑ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ ๊ณ ๋ฅธ๋ค.
4. ๋๊ด์ : ์์ ๋ค ๊ฒ์ฆํ๋ค
์ฌ์ฉ์๋ค์ด ๋์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ ์ ๊ฒ์ผ๋ก ๊ฐ์
Kung๊ณผ Robinson์ OCC(Optimistic Concurrency Control)๋ ํธ๋์ญ์ ์์ ์ค ๊ณต์ ๋ฐ์ดํฐ์ ๋ฝ์ ๊ฑธ์ง ์๊ณ ๋ฐ์ ์ ์ ์ถฉ๋์ ๊ฒ์ฆํ๋ค.
- ์ฝ๊ธฐ ๋จ๊ณ: ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ๊ณ์ฐํ๋ค. ๊ฒฐ๊ณผ๋ ๋ก์ปฌ์ ๋๋ค
- ๊ฒ์ฆ ๋จ๊ณ: ์ฝ์ ๋ฐ์ดํฐ๊ฐ ๊ทธ์ฌ์ด ๋ค๋ฅธ ์์ ๊ณผ ์ถฉ๋ํ๋์ง ํ์ธํ๋ค
- ์ฐ๊ธฐ ๋จ๊ณ: ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ๋ค
์ ํ๋ฆฌ์ผ์ด์
์์๋ ๋ฒ์ ์ปฌ๋ผ๊ณผ ์กฐ๊ฑด๋ถ UPDATE๋ก ๋๊ด์ ๋์์ฑ ์ ์ด๋ฅผ ๊ตฌํํ ์ ์๋ค.
-- ์ฝ์ ๋ ๋ฒ์ ๋ ํจ๊ป ๊ฐ์ ธ์จ๋ค
SELECT balance, version FROM accounts WHERE id = 1; -- version = 3
-- ๋ฐ์ํ ๋ ์ฝ์๋ ๋ฒ์ ์ด ์ ์ง๋๋์ง ํ์ธํ๋ค
UPDATE accounts SET balance = 500, version = 4
WHERE id = 1 AND version = 3;
-- ์ํฅ๋ฐ์ ํ์ด 0์ด๋ฉด version์ด ๋ฐ๋์๊ฑฐ๋ ๋์ ํ์ด ์๋ค์ด SQL์ PostgreSQL์์ ์คํํ๋ฉด UPDATE ์์ฒด๋ ํ
์ด๋ธ ๋ฝ๊ณผ ํ ๋ฝ์ ์ฌ์ฉํ๋ค. ๋์์ ๊ฐ์ ํ์ ๊ฐฑ์ ํ๋ฉด ๋๊ธฐํ ๋ค version = 3 ์กฐ๊ฑด์ ๋ค์ ํ๊ฐํด ์ํฅ๋ฐ์ ํ์ด 0์ด ๋ ์ ์๋ค. ํธ์ถ์๋ ํ ์๋ฅผ ํ์ธํ๊ณ ์ฌ์๋ํ๊ฑฐ๋ ์ถฉ๋๋ก ์ฒ๋ฆฌํ๋ค.
ORM์์๋ ์ด๋ฅผ ๋๊ด์ ์ ๊ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. Hibernate์ JPA์ @Version์ ๊ฐ์ ํํ์ ์กฐ๊ฑด๋ถ ๊ฐฑ์ ์ ๋ง๋ ๋ค.
CAS: ๊ฐ์ ๋น๊ตํ ๋ค ๋ณ๊ฒฝ
- compare-and-swap์ ํ์ฌ ๊ฐ์ด ์์๊ฐ๊ณผ ๊ฐ์ ๋๋ง ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ๋ ์์์ ์ฐ์ฐ์ด๋ค
- CPU์
CMPXCHG, SQL์ ์กฐ๊ฑด๋ถUPDATE, HTTP์If-Match๋ ์๋ก ๋ค๋ฅธ ๊ณ์ธต์์ ๊ฐ์ ๋น๊ต ํ ๋ณ๊ฒฝ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค- ์ SQL์ ๊ฐ ๋์
version์ ๋น๊ต ์กฐ๊ฑด์ผ๋ก ์ด๋ค
์ฃผ์: ์กฐ๊ฑด๋ถ ๊ฐฑ์ ์ ์คํจ ์ฒ๋ฆฌ
- ์ํฅ๋ฐ์ ํ์ด 0์ด๋ฉด ๊ฐฑ์ ์ด ๋ฐ์๋์ง ์์๋ค
- ํ ์๋ฅผ ํ์ธํ์ง ์์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํจํ ๊ฐฑ์ ์ ์ฑ๊ณต์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค
- ์ฌ์๋ ์ฌ๋ถ์ ํ์๋ ์์ ์ ๋ฉฑ๋ฑ์ฑ, ์ถฉ๋ ๋น๋, ์ฌ์ฉ์ ์๋ต ์ ์ฑ ์ ๊ธฐ์ค์ผ๋ก ์ ํ๋ค
- ๋ฒ์ ์ปฌ๋ผ ๋ฐฉ์์ lock-based DB์์ ์คํํ๋ฉด ๋ค๋ฅธ ๋ฝ๊ณผ์ ๋๊ธฐ๋ multi-resource deadlock์ด ์๊ธธ ์ ์๋ค
5. ์ค์ ์์คํ ์ ์กฐํฉ
์ค์ ๊ตฌํ์ ๋ฒ์ ๊ฐ์์ฑ, ๋ฝ, ์ถฉ๋ ๊ฒ์ฆ์ ์ฉ๋์ ๋ฐ๋ผ ์กฐํฉํ๋ค.
PostgreSQL
| ์ถฉ๋ | ๊ธฐ๋ณธ ์ฒ๋ฆฌ |
|---|---|
| reader โ writer | ์ผ๋ฐ SELECT๋ row lock ์์ด ์ค๋
์ท์ ๋ณด์ด๋ ๋ฒ์ ์ ์ฝ์ |
| writer โ writer | ๊ฐ์ ํ์ ๋ค์ชฝ UPDATE๊ฐ ํ ๋ฝ์์ ๋๊ธฐํ ๋ค ๊ฒฉ๋ฆฌ ์์ค์ ๋ง๊ฒ ์ฒ๋ฆฌ๋จ |
์ผ๋ฐ SELECT๋ ACCESS SHARE relation lock์ ํ๋ํ๋ค. ์ด ๋ฝ์ ์ผ๋ฐ์ ์ธ UPDATE์ relation lock๊ณผ ํธํ๋๋ฏ๋ก readerโwriter ๋๊ธฐ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
| ๊ฒฉ๋ฆฌ ์์ค | PostgreSQL์ ์ถ๊ฐ ๊ท์น |
|---|---|
| Read Committed (๊ธฐ๋ณธ) | ๋ฌธ์ฅ๋ง๋ค ์ ์ค๋ ์ท์ ์ฌ์ฉ |
| Repeatable Read | ์ฒซ ์กฐํยท๋ณ๊ฒฝ ๋ฌธ์ฅ์์ ์ป์ ์ค๋ ์ท์ ํธ๋์ญ์ ๋์ ์ฌ์ฉ |
| Serializable | ๊ฐ์ ์ค๋ ์ท ๊ท์น์ SSI ์์กด ์ถ์ ์ ์ถ๊ฐ |
์ ํ์ ์ถ์ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ์ ํ์ ์ถ์ ์ถฉ๋ ์์ด๋ค.
SSI์
SIReadLock
- ์ด๋ฆ์ lock์ด ์์ง๋ง ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋๊ธฐ์ํค์ง ์๋๋ค
- PostgreSQL์ ์ฝ์ ๋ฒ์์ ์ฝ๊ธฐยท์ฐ๊ธฐ ์์กด์ ์ถ์ ํ๋ ํ์์ผ๋ก ์ฌ์ฉํ๋ค
- ์ํํ ์์กด ๊ตฌ์กฐ๋ฅผ ๊ฐ์งํ๋ฉด ํธ๋์ญ์ ํ๋๋ฅผ serialization failure๋ก ์ค๋จํ๋ค
- ํธ์ถ์๋ ์ค๋จ๋ ์์ ์ ์ฌ์๋ํ๊ฑฐ๋ ์คํจ๋ก ์ฒ๋ฆฌํ๋ค
๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์์ ํ ์ด๋ธ ํฌ๋งท
ํ ์ด๋ธ ํฌ๋งท์ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ค๋ ์ท ์ ํ๊ณผ ๋์ ์ปค๋ฐ ๊ฒ์ฆ์ ์ถ๊ฐํ๋ค. ๋ค์ ํ๋ ๊ฐ ํฌ๋งท์ ์ค๋ ์ท ์ ํ๊ณผ ๋์ ์ฐ๊ธฐ ์ฒ๋ฆฌ ์์๋ค.
| ํฌ๋งท | readerโwriter | writerโwriter์ ๋ํ ์ฒ๋ฆฌ |
|---|---|---|
| Iceberg | ์ปค๋ฐ๋ ์ค๋ ์ท์ ์ ํ | ์นดํ๋ก๊ทธ์์ ํ์ฌ ๋ฉํ๋ฐ์ดํฐ ํฌ์ธํฐ๋ฅผ ์กฐ๊ฑด๋ถ ๊ต์ฒด |
| Delta Lake | ๋ฒ์ ๋ณ transaction log๋ฅผ ์ฝ์ | ๋ค์ ๋ก๊ทธ ๋ฒ์ ์ปค๋ฐ์ ๊ฒ์ฆํ๊ณ ์ถฉ๋ ์ ์์ ์ ๋ฐ๋ผ ์ฌ์๋ |
| Hudi | ํ์๋ผ์ธ์ ์๋ฃ๋ instant๋ฅผ ์ฝ์ | multi-writer OCC ๋ชจ๋์์ lock provider์ ์ถฉ๋ ๊ฒ์ฆ์ ์ฌ์ฉ |
Hudi์์ ํ ํ๋ก์ธ์ค์ writer์ async table service๋ฅผ ์กฐ์ ํ ๋๋ InProcessLockProvider๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ตฌํ๊ณผ ์ด์ ์ค์ ์ ํ
์ด๋ธ ํฌ๋งท์์ ๋ค๋ฃฌ๋ค.
6. ์ ํ ๊ธฐ์ค
๋น๊ด์ ๋ฐฉ์๊ณผ ๋๊ด์ ๋ฐฉ์์ ์ถฉ๋ ๋น๋์ ์ถฉ๋ ๋ค ์ฒ๋ฆฌ ๋น์ฉ์ ํจ๊ป ๋น๊ตํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ์ ์ปฌ๋ผ OCC๋ DB ๋ด๋ถ์์๋ ๋ฝ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ ๋ฐฉ์์ ๋ฝ์ ์ ๋ฌด๋ง์ผ๋ก ๋๋์ง ์๋๋ค.
| ๋น๊ต ํญ๋ชฉ | ๋น๊ด์ ๋ฐฉ์ | ๋๊ด์ ๋ฐฉ์ |
|---|---|---|
| ์์๋ฅผ ์ ํ๋ ์์ | ์์ ์ ์ด๋ ์คํ ์ค | ๊ฒฐ๊ณผ ๋ฐ์ ์ ๊ฒ์ฆ ์์ |
| ์ถฉ๋ ์ฒ๋ฆฌ | ๋๊ธฐํ๊ฑฐ๋ ํธ๋์ญ์ ์ค๋จ | ๊ฒ์ฆ ์คํจ ํ ์์ ๋ณ ์ ์ฑ ์ ์ฉ |
| ํ์์ ๋น์ฉ | ๋ฝ ํ๋๊ณผ ๊ด๋ฆฌ | ๋ฒ์ ยท๊ฒ์ฆ ์ ๋ณด ๊ด๋ฆฌ |
| ์คํจ ๊ฐ๋ฅ์ฑ | ๋ฐ๋๋ฝ, timeout, serialization failure ๋ฑ | ๊ฒ์ฆ ์คํจ, starvation, DB ๋ฝ ๊ด๋ จ ์คํจ ๋ฑ |
| ์ฌ์ฒ๋ฆฌ ๋น์ฉ | ์ค๋จ๋ ํธ๋์ญ์ ๋ฒ์ | ๊ฒ์ฆ ์ ์ ์ํํ ๊ณ์ฐ๊ณผ I/O ๋ฒ์ |
- ๊ฐ์ ํ์ ๊ฐฑ์ ์ด ์์ฃผ ๊ฒน์น๋ ์์ : ์ฌ์๋ ๋น์ฉ๊ณผ ๋ฝ ๋๊ธฐ ์๊ฐ์ ์ธก์ ํด ๋น๊ด์ ๋ฐฉ์์ ์ฐ์ ๊ฒํ ํ๋ค
- ๊ฐฑ์ ๋์์ด ๋๊ฒ ๋ถ์ฐ๋ ์์ : ์ถฉ๋์ด ๋๋ฌผ๊ณ ์ฌ๊ณ์ฐ์ด ์ ๋ ดํ๋ฉด ๋๊ด์ ๊ฒ์ฆ์ ์ฐ์ ๊ฒํ ํ๋ค
- ์ฝ๊ธฐ๊ฐ ๋ง์ ์ํฌ๋ก๋: MVCC๋ readerโwriter ๋๊ธฐ๋ฅผ ์ค์ด์ง๋ง ์ฐ๊ธฐ ์ถฉ๋๊ณผ ๊ฒฉ๋ฆฌ ์์ค์ ๋ฌธ์ ๋ ๋ณ๋๋ก ์ฒ๋ฆฌํ๋ค
- ์กฐ๊ฑด์ ์ฝ๊ณ ์ฌ๋ฌ ํ์ ๊ฐฑ์ ํ๋ ์์ : ๊ฐ๋ณ ํ ์ถฉ๋๊ณผ ํจ๊ป predicate ๋ฒ์์ ์ผ๊ด์ฑ์ด ํ์ํ์ง ํ์ธํ๋ค
์ ํํ ๋๋ ์ถฉ๋๋ฅ , ํ๊ท ยท์ต๋ ๋๊ธฐ ์๊ฐ, ์ฌ์๋ ํ์, ํ ๋ฒ์ ์ฌ์ฒ๋ฆฌ ๋ฒ์๋ฅผ ์ธก์ ํ๋ค. ๊ฐ์ ์ถฉ๋๋ฅ ์ด์ด๋ ๊ฒ์ฆ ์ ์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ๊ณ์ฐํ๋ค๋ฉด ์ฌ์ฒ๋ฆฌ ๋น์ฉ์ด ์ปค์ง๋ค.