์ฃผ์
ํธ๋์ญ์ ์ ACID ์์ฑ ์ค ๊ฒฉ๋ฆฌ์ฑ(Isolation)์ด ๋ณด์ฅ๋์ง ์์ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ค์ ์ค๋ช ํ๊ณ ,
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
ํธ๋์ญ์ ์ด๋?
ํธ๋์ญ์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณํ์ํค๊ธฐ ํด์ ์ํํ๋ ํ๋์ ๋ ผ๋ฆฌ์ ์์ ๋จ์์ด๋ค.
ACID
ACID๋ ํธ๋์ญ์ ์ ์ ์ํ๋ 4๊ฐ์ง ์์ฑ์ ๋งํ๋ค.
์์์ฑ A: Atomicity
ํธ๋์ญ์
์ ์์์ ์ผ๋ก ์ํ๋๋ ์ฐ์ฐ๋ค์ ๋ฌถ์ ํ๋์ ๋จ์์ด๋ค.
์์์ ์ด๋, ์์
์ํ ์ ์ด ๋ชจ๋ ์ฐ์ฐ๋ค์ด ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋ ๋๋ ๋ชจ๋ ์ํ๋์ง ์์์ผ ํ๋ค๋ ๋ป์ด๋ค.
๋ถ๋ถ์ ์ผ๋ก ์ฑ๊ณตํ์ฌ ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ์๊ธฐ์ง ์๋๋ก
๋ชจ๋ ์ฑ๊ณตํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฐํ๊ฑฐ๋ ๋๋ ๋ถ๋ถ์ ์ผ๋ก ์ฑ๊ณตํ ๊ฒฝ์ฐ๋ ๋กค๋ฐฑํ์ฌ ์๋ฌด๊ฒ๋ ์ผ์ด๋์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ฌ์ผ ํ๋ค.
์๋ฅผ ๋ค์ด ๊ณ์ข์ด์ฒด๋ผ๋ ํ๋์ ์์ ๋จ์์๋ ๋ ๋จ๊ณ๊ฐ ์๋ค.
- A ๊ณ์ข์์ 100๋ง์์ ์ถ๊ธํ๋ค.
- B ๊ณ์ข์ 100๋ง์์ ์ ๊ธํ๋ค.
๋ง์ฝ 1๋ฒ๋ง ๋ถ๋ถ์ ์ผ๋ก ์ฑ๊ณตํ๊ฑฐ๋ 2๋ฒ๋ง ์ฑ๊ณตํ๋ ์ผ์ ์์ด์ผ ํ๋ค.
1, 2๋ฒ ๋ชจ๋ ์ฑ๊ณตํ์ฌ ๊ณ์ข์ด์ฒด๊ฐ ์ ์์ ์ผ๋ก ์ด๋ค์ง๊ฑฐ๋(์ปค๋ฐ)
1๋ฒ์ ์ฑ๊ณตํ์ง๋ง 2๋ฒ์์ ์คํจํ๋ค๋ฉด 1๋ฒ๊ณผ 2๋ฒ ๋ ๋ค ์คํจ๋ก ๋์๊ฐ์ผ ํ๋ค.(๋กค๋ฐฑ)
์ผ๊ด์ฑ C: Consistency
ํธ๋์ญ์
์ด ์ผ์ด๋๋ ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํญ์ ์ผ๊ด๋ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฝ์กฐ๊ฑด์ด๋ ๊ท์น์ ๋ง์กฑํด์ผ ํ๋ค๋ ๋ป์ด๋ค.
NOT NULL์ด๋ UNIQUE ์ด๋ฐ ์ ์ฝ์กฐ๊ฑด ์ธ์๋
์ฃผ๋ฌธ ๋ด์ญ์ ๋ค๋ฃจ๋ Order ํ
์ด๋ธ์ ๊ธฐ๋ก๋ ์ด ๊ฐ๊ฒฉ์ ์ฃผ๋ฌธํ Item๋ค์ ๊ฐ๊ฒฉ์ ํฉ๊ณผ ๋ ๊ฐ์์ผ ํ๋ค๋ ์๊ตฌ์ฌํญ ๋ฑ์ด ํฌํจ๋๋ค.
๊ฒฉ๋ฆฌ์ฑ I: Isolation
๋ชจ๋ ํธ๋์ญ์
์ ๋ค๋ฅธ ํธ๋์ญ์
๊ณผ ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๋ค.
์ฆ, ๋ชจ๋ ํธ๋์ญ์
์ ์๋ก ๋
๋ฆฝ์ ์ด๋ค.
ํธ๋์ญ์ A์ ํธ๋์ญ์ B๊ฐ ๋์์ ์คํ๋๋ ์๋ก์๊ฒ ์ํฅ์ ๋ผ์น๋ฉด ์ ๋๋ค.
์ง์์ฑ D: Durability
ํธ๋์ญ์
์ด ํ ๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฐ๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ ์๊ตฌ์ ์ผ๋ก ๋ฐ์๋๋ค.
์ปค๋ฐ๋ ์ดํ์๋ ๊ทธ ํ์ ์์คํ
์ฅ์ ๋ฑ์ด ์ผ์ด๋๋ ์๋๋ ์๊ตฌ์ ์ผ๋ก ํด๋น ๋ฐ์ดํฐ๊ฐ ์ ์ฅ์ด ๋์ด ์์ด์ผ ํ๋ค.
๊ฒฉ๋ฆฌ์ฑ์ด ๋ณด์ฅ๋์ง ์๋๋ค๋ฉด?
๊ฒฉ๋ฆฌ์ฑ์ด ๋ณด์ฅ๋์ง ์์ผ๋ฉด,
์ฆ ํ ํธ๋์ญ์
์ด ์ฌ์ฉ ์ค์ธ ๋ฐ์ดํฐ์ ๋ํด ๋ค๋ฅธ ํธ๋์ญ์
์ ์ ๊ทผ์ ํ์ฉํ๋ฉด
ํธ๋์ญ์
์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ผ์ด๋ ์ ์๋ ๋ฌธ์ ๋ ์ด 3๊ฐ์ง๊ฐ ์๋ค.
Dirty Read
The transaction reads a row that has been changed, but the change has not been commited. If the change is rolled back, the transaction has incorrect data.
ํธ๋์ญ์
์ด ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋๋ฐ
๊ทธ ์์ ์ด ์ปค๋ฐ๋์ง ์๊ณ ๋กค๋ฐฑ๋๋ฉด, ํธ๋์ญ์
์ ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋๋ค.
์ด๊ธฐ์ a = 100 ์ผ๋ก ์์ํ๋ค.
ํธ๋์ญ์
A์์ a = 50์ผ๋ก ์์ ํ๋ค.
์ด๋ ํธ๋์ญ์ B๊ฐ ์์ํ์ฌ a๋ฅผ ์ฝ์ผ๋ฉด a = 50 ์ด๋ผ๊ณ ์ฝ๋๋ค.
ํ์ง๋ง ํธ๋์ญ์
A๊ฐ ์คํจํ์ฌ ๋กค๋ฐฑ์ด ์ผ์ด๋๋ฉด
๋ค์ a = 100์ผ๋ก ๋์๊ฐ๋ค.
ํธ๋์ญ์ B๊ฐ ์ฝ์ a = 50์ด๋ ๊ฐ์ ์กด์ฌํด์๋ ์ ๋๋, ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ๋๋ค.
Non-repeatable Read
The transaction rereads data that has been changed, and finds changes due to commited transactions.
ํ ํธ๋์ญ์
์์ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋ค.
๋๊ฐ์ ํธ๋์ญ์
์์ "๋ค์" ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋๋ฐ ๊ฐ์ด ๋ฌ๋ผ์ ธ ์๋ค.
ํธ๋์ญ์
A์์ a๋ฅผ ์ฝ์์ ๋ ๊ทธ ๊ฐ์ด 100์ด์๋ค.
A์์ ๋ค๋ฅธ ์์
์ ํ๊ณ ์์ ๋ ๋ค๋ฅธ ํธ๋์ญ์
B์์ a = 50์ผ๋ก ์์ ํ๋ค.
ํธ๋์ญ์
A๊ฐ ๋ค๋ฅธ ์์
์ ๋ง์น๊ณ , ๋ค์ a๋ฅผ ์ฝ์์ ๋ ๊ฐ์ด 50์ผ๋ก ์๊น ์ฝ์๋ ๊ฐ๊ณผ ๋ค๋ฅด๋ค.
๋ง์ฝ ํธ๋์ญ์ A๊ฐ ์ฒ์์ ์ฝ์ a ๊ฐ์ ๋ฐํ์ผ๋ก ์์ ์ ํ๊ณ ์์๋ค๋ฉด ๊ณค๋ํด์ง๋ค.
Phantom Read
The transaction rereads data and finds new rows inserted by a commited transactions.
ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฝ์๋๋ฐ ์ด์ ์ ์๋ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค.
์๋ก์ด ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ปค๋ฐ์ผ๋ก ์๊ธด๋ค.
ํธ๋์ญ์ A๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ User ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋ค. ์ด๋ ์ฝ์ row ์๋ 1๊ฐ๋ค.
ํธ๋์ญ์ A๊ฐ ๋๋์ง ์์๋๋ฐ ํธ๋์ญ์ B์์ User ํ ์ด๋ธ์ ์๋ก์ด row๋ฅผ ์ถ๊ฐํ๊ณ ์ปค๋ฐํ๋ค.
ํธ๋์ญ์ A๊ฐ ๋ค์ User ํ ์ด๋ธ์ ์ฝ์๋๋ ์ด์ ์กฐํ ๋๋ ์๋ ๋ฐ์ดํฐ Bob์ด ์๊ฒผ๋ค.
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค์ด๋,
ํ ํธ๋์ญ์
์ด ์ฌ์ฉ ์ค์ธ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๋ํด ๋ค๋ฅธ ํธ๋์ญ์
์ ์ ๊ทผ ํ์ฉ ์ ๋๋ฅผ ๋งํ๋ค.
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ์กฐ์ ํ์ฌ์ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ ์ ์๋ค.
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ด 4๊ฐ์ง๊ฐ ์๋ค.
- Lv 0: Read Uncommited
- Lv 1: Read Commited
- Lv 2: Repeatable Read
- Lv 3: Serializable
๊ฒฉ๋ฆฌ ์์ค์ด ๋์์๋ก ๊ฒฉ๋ฆฌ์ฑ์ด ๋ณด์ฅ๋์ด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋์์ง๊ณ ,
์์์ ์ธ๊ธํ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ ์ผ์ด ์ค์ด๋ ๋ค. ๊ทธ๋ฌ๋ ๋์์ฑ(๋์ ์ฌ์ฉ์ ์ ์์จ)์ ๋ฎ์์ง๋ค.
Read Uncommited
์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์กฐํํ ์ ์๋๋ก ํ์ฉํ๋ค.
ํธ๋์ญ์
T2๊ฐ ํธ๋์ญ์
T1์ด ์ปค๋ฐํ๊ธฐ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค.
์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๊ฒ์ด๋ค.(Read Uncommited)
์ด ๊ฒฝ์ฐ ํธ๋์ญ์
๊ฐ์ ๊ฒฉ๋ฆฌ๊ฐ ์ ํ ๋์ง ์์์ผ๋ฏ๋ก
Dirty Read, Nonrepeatable Read, Phantom Read ๋ฌธ์ ๊ฐ ๋ชจ๋ ๋ฐ์ํ ์ ์๋ค.
Read Commited
์ปค๋ฐ๋ ๋ณ๊ฒฝ๋ง ์ฝ๋๋ก ์์ ํ๋ฉด
Dirty Read๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
ํธ๋์ญ์
T2์์ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ค๊ณ ํ ๋
๋ง์ฝ ๊ทธ ๋ฐ์ดํฐ๊ฐ ํธ๋์ญ์
T1์์ ์์ ๋๊ณ ์๋ค๋ฉด
ํธ๋์ญ์
T2๋ ํธ๋์ญ์
T1์ด ์ปค๋ฐํ ๋๊น์ง ๊ฐ์ ์ฝ์ง ์๋๋ค.
์ปค๋ฐ์ด ๋์ง ์์ ๊ฐ์ ์ฝ์ง ์์ผ๋ฏ๋ก ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ผ์ด ์์ด Dirty Read๊ฐ ๋ฐฉ์ง๋๋ค.
๊ทธ๋ฌ๋ ์์ง ํธ๋์ญ์
T1์ด ๋๋์ง ์์ ์ํ์์ ํธ๋์ญ์
T2๊ฐ ์ปค๋ฐ์ ํ๋ฉด T1์ด ๊ฐ์ ๋ค์ ์ฝ์์ ๋
์ด์ ์ ์ฝ์ ๊ฐ๊ณผ ๋ค๋ฅผ ์ ์๋ค.
์ฆ, Non-Repeatable Read ๋ฌธ์ ๋ ์์ง ๋ฐ์ํ๋ค.
๋น์ทํ๊ฒ Phantom Read ์ญ์ ์ผ์ด๋ ์ ์๋ค.
- PostgreSQL์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค ๋จ๊ณ์ด๋ค.
Repeatable Read
Read Commited์์ ๋ ๋์๊ฐ
ํ ํธ๋์ญ์
๋ด์์ ์ด์ ์ ์ฝ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฝ์์ ๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํญ์ ๋๊ฐ์์ ๋ณด์ฅํ๋ค.
Non-Repeatable Read๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
MySQL, PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฝ์ฐ ์ค๋ ์ท์ ์ฌ์ฉํ์ฌ ์ด ๋จ๊ณ๋ฅผ ๊ตฌํํ๋ค.
ํธ๋์ญ์ T1์์ ์ฒ์์ผ๋ก a๋ฅผ ์ฝ์ ๋ ์ค๋ ์ท์ ๋ง๋ค์ด ๋๊ณ , ์ดํ a๋ฅผ ๋ค์ ์กฐํํ ๋๋ ์ค๋ ์ท์์ ์ฝ์ด ํ ํธ๋์ญ์ ๋ด์์๋ ์ธ์ ๋ ๊ฐ์ ๊ฐ์ ์ฝ์ ์ ์๋ค.
-> Non-Repeatable Read ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
๊ทธ๋ฌ๋ ์์ ๋ ๊ฐ์ ์๊ด ์์ง๋ง
๋ค๋ฅธ ํธ๋์ญ์
์์ ์ถ๊ฐํ ๋ฐ์ดํฐ๋ ์ฌ์ ํ ๋ณผ ์ ์๋ค.
๋๋ฌธ์ Phantom Read ๋ฌธ์ ๋ ๊ณ์ ๋ฐ์ํ ์ ์๋ค.
- MySQL์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค ๋จ๊ณ์ด๋ค.
Serializable
Serializable์ ์ง๊ธ๊น์ง์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก,
ํ ํธ๋์ญ์
์ด ์ด๋ ๋ฐ์ดํฐ์์ ์์
ํ๊ณ ์์ ๋
๋ค๋ฅธ ํธ๋์ญ์
์ด ์ด ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๊ฒ ๋ฝ(lock)์ ๊ฑด๋ค.
๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง๋ง
์ฌ๋ฌ ํธ๋์ญ์
์์ ํ ๋ฐ์ดํฐ์ ๋์ ์ ๊ทผํ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก
๋์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ๋จ์ด์ ธ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋๋ฝ
Seriablizable์์ ๋ฝ์ ๊ฑธ๋ฉด ๋์์ฑ์ ์ ์ดํด์ค ์ ์์ง๋ง ๊ทธ ๋ถ์์ฉ์ผ๋ก ๋ฐ๋๋ฝ์ด ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋๋ฝ์ด๋ ์ฌ๋ฌ ๊ฐ์ ํธ๋์ญ์ ๋ค์ด ์คํ์ ํ์ง ๋ชปํ๊ณ , ์๋ก ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ๋ฅผ ์๋ฏธํ๋ค.
ํธ๋์ญ์
T1์์๋ User ํ
์ด๋ธ์ id=1, id=2์ธ ์์๋๋ก ์์ ํ๋ ค ํ๊ณ ,
ํธ๋์ญ์
T2์์๋ User ํ
์ด๋ธ์ id=2, id=1 ์์๋๋ก ์์ ํ๋ ค๊ณ ํ๋ค.
T1์์ id=2์ธ row์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ด๋ฏธ ๊ทธ ๋ฐ์ดํฐ์ ๋ฝ์ T2๊ฐ ๊ฐ์ง๊ณ ์๋ค. T2์์ id=1์ธ row์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ด๋ฏธ ๊ทธ ๋ฐ์ดํฐ์ ๋ฝ์ T1์ด ๊ฐ์ง๊ณ ์๋ค.
๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฝ์ ๋จผ์ ์ ์ ํ๊ณ ์๋ ํธ๋์ญ์
์๊ฒ์ ๋ฝ์ ์์ ๊ถ์ ์ป์ด์ผ ํ๋ค.
๊ทธ๋ฌ๋ ๋ ํธ๋์ญ์ ๋ชจ๋ ์ปค๋ฐ๋๊ฑฐ๋ ๋กค๋ฐฑ๋์ง ์์ ๋ฝ์ ๋ฐํํ ์๋ ์์ด ๋ฝ์ ๊ณ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด์๋ ๋ค์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ด ๋ฌดํ ๋๊ธฐ ์ํ์ ๋น ์ง๋ค.
์คํ๋ง์์ ๊ฒฉ๋ฆฌ ์์ค ์ค์
@Transactional ์ ๋ ธํ ์ด์ ์์ isolation ์ค์ ์ผ๋ก ๊ฒฉ๋ฆฌ ์์ค์ ์ค์ ํ ์ ์๋ค.
@Transactional(isolation=Isolation.REPEATABLE_READ)
public void someMethod() { ... }
๊ฒฉ๋ฆฌ ์์ค ์ ๋ฆฌ
ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์งํค๊ธฐ ์ํด
ํธ๋์ญ์
๊ฐ์ ๊ฒฉ๋ฆฌ ์ ๋๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ด๋ค.
๊ฐ ๊ฒฉ๋ฆฌ ์์ค์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฒฉ๋ฆฌ ์์ค์ด ๋์์ง์๋ก ๋ฌธ์ ๋ค์ด ํด๊ฒฐ๋์ด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋์์ง์ง๋ง
๋์์ฑ์ ๋ฎ์์ ธ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ฐธ๊ณ ์๋ฃ
- ๐ Fundamentals of Database Systems, 2017, Ramez Elmasri and Shamkant B.Navathe
- [๋ฐ์ดํฐ๋ฒ ์ด์ค] ํธ๋์ญ์ ์ ACID ์ฑ์ง
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ด๋ ๋ฌด์์ด๊ณ ์ ํ์ํ ๊น
'๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DB] ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทํ์ ์ญ์ ๊ทํ: 1NF, 2NF, 3NF, BCNF (0) | 2025.03.09 |
---|---|
[DB] SQL ๋ช ๋ น์ด ์ ๋ฆฌ: DDL, DML, DQL, DCL, TCL (0) | 2025.03.09 |