๐ง ํธ๋์ญ์ ์ด๋ ?
DB ์ํ๋ฅผ ๋ณํ์ํค๋ ํ๋์ ๋ ผ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํ ์์ ์ ๋จ์ ๋๋ ํ๊บผ๋ฒ์ ๋ชจ๋ ์ํ๋์ด์ผ ํ ์ผ๋ จ์ ์ฐ์ฐ๋ค
๐ง JPA ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค
ํธ๋์ญ์ ์ด ๋ณด์ฅํด์ผํ๋ ACID ์ค ๊ฒฉ๋ฆฌ์ฑ๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ธ๋ฐ ๊ฒฉ๋ฆฌ์ฑ์ ์๋ฒฝํ ๋ณด์ฅํ๋ ค๋ฉด ๋์์ฑ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋งค์ฐ ๋๋น ์ง๋ค.
์ด๋ฐ ๋ฌธ์ ๋ก ์ธํด ANSI ํ์ค์ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ 4๋จ๊ณ๋ก ๋๋์ด ์ ์ํ๋ค.
- Atomicity; ์์์ฑ
- ํธ๋์ญ์ ๋ด์ ์์ ๋ค์ ๋ชจ๋ ์ฑ๊ณต ๋๋ ๋ชจ๋ ์คํจํ๋ค.
- Consistency; ์ผ๊ด์ฑ
- ๋ชจ๋ ํธ๋์ญ์ ์ ์ผ๊ด์ฑ ์๋ DB ์ํ๋ฅผ ์ ์งํ๋ค.
- (ex: DB์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด ํญ์ ๋ง์กฑ)
- Isolation; ๊ฒฉ๋ฆฌ์ฑ
- ๋์์ ์คํ๋๋ ํธ๋์ญ์ ๋ค์ ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- (ex: ๋์์ ๊ฐ์ ๋ฐ์ดํฐ ์์ X)
- Durability; ์ง์์ฑ
- ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ ํญ์ ๊ธฐ๋ก๋์ด์ผ ํ๋ค.
๐ง ํธ๋์ญ์ ๊ด๋ฆฌ ํฌ์ธํธ 3
๋ฎ์ ๋จ๊ณ์ ํธ๋์ญ์ ๊ณ ๋ฆฝํ ์์ค ์ด์ฉ์ ๋ฐ์ํ๋ ํ์ 3๊ฐ์ง
- Nonrepeatble Read
- ํธ๋์ญ์ ์ด ์ํ์ค์ธ๋ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํด์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ.
- ํ ํธ๋์ญ์
๋ด์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ํํ ๋
๊ทธ ์ฌ์ด์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ฐ์ ์์ ๋๋ ์ญ์ ํจ์ผ๋ก์จ
๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์์ดํ๊ฒ ๋ํ๋๋ ๋น ์ผ๊ด์ฑ ๋ฐ์ํ๋ค.
- Phantom Read
- ๋์ผํ ์ฟผ๋ฆฌ๊ฐ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๋ ๊ฒ
- ํ ํธ๋์ญ์
์์์ ์ผ์ ๋ฒ์์ ๋ ์ฝ๋๋ฅผ ๋ ๋ฒ ์ด์ ์ฝ์ ๋,
์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์๋ ๋ ์ฝ๋๊ฐ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ๋ํ๋๋ ํ์.
์ด๋ ํธ๋์ญ์ ๋์ค ์๋ก์ด ๋ ์ฝ๋๊ฐ ์ฝ์ ๋๋ ๊ฒ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ํ๋๋ค.
- Dirty Read
- ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๊ฐ ์์ง ๋ฏธ์์ฑ์ธ๋ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝ์ด๊ฐ๋ ๊ฒ.
- T1 ํธ๋์ญ์
์์ ์ฝ๊ธฐํ๊ณ ์คํ์ด ๋๋์ง ์์ ์ํ์์
T2 ํธ๋์ญ์ ์ ์ํด ๋ณ๊ฒฝ๋ ์ฌํญ์ ๋ณด๊ฒ ๋๋ ๊ฒฝ์ฐ๋ฅผ dirty read ๋ผ๊ณ ํ๋ค.
๋ง์ฝ T2 ํธ๋์ญ์ ์์ ๊ทธ ๋ณ๊ฒฝ ์ฌํญ์ rollbackํ๋ฉด
๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ T1 ํธ๋์ญ์ ์ Dirty ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด๋ค.
๐ง ๊ฒฉ๋ฆฌ์์ค
์๋๋ก ๋ด๋ ค ๊ฐ์๋ก ๋์์ฑ์ด ๋์์ง๋ ๋์ ์๋๊ฐ ๋๋ ค์ง๋ค. ( lv.0 -> lv.3)
์๋ก ์ฌ๋ผ ๊ฐ์๋ก ๋์์ฑ์ด ๋จ์ด์ง๋ ๋์ ์๋๊ฐ ๋นจ๋ผ์ง๋ค. (lv.3 -> lv.0)
- READ UNCOMMITED (lv.0)
- ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ ์ฝ์ ์ ์์
- Aํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ค ์๋ฌ๊ฐ ๋ฐ์ํด์ Rollback์ ํ๋ค๊ณ ์น๋ฉด Aํธ๋์ญ์ ์ด ์คํ๋๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ B ํธ๋์ญ์ ์ ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์์ ์๊ฐ ์๋ค. Dirty Read, Dirty Write์ด ๊ฐ๋ฅํจ
- Dirty Read๋ ๋ฐฉ์ง X, Noorepeatable read๋ฐฉ์ง X, Phantom Read ๋ฐฉ์ง X
- ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ ์ฝ์ ์ ์์
- READ COMMITED (lv.1)
- ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ๋ถ๋ฌ์จ๋ค. (= ๋ฐ๋ณตํด์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค)
- SELECT ๋ฌธ์ฅ์ด ์ํ๋๋ ๋์ ํด๋น ๋ฐ์ดํฐ์ Shared Lock(์ฝ๊ธฐ ๊ฐ๋ฅ, ๋ณ๊ฒฝ ๋ถ๊ฐ)์ด ๊ฑธ๋ฆฌ๋ ๋ ๋ฒจ
- ์ด๋ ํ ์ฌ์ฉ์๊ฐ A๋ผ๋ ๋ฐ์ดํฐ๋ฅผ B๋ผ๋ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ ํด๋น ๋ฐ์ดํฐ(B)์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- Dirty Read ๋ฐฉ์ง O , Non-Repeatable Read ๋ฐฉ์ง X
- SELECT ๋ฌธ์ฅ์ด ์ํ๋๋ ๋์ ํด๋น ๋ฐ์ดํฐ์ Shared Lock(์ฝ๊ธฐ ๊ฐ๋ฅ, ๋ณ๊ฒฝ ๋ถ๊ฐ)์ด ๊ฑธ๋ฆฌ๋ ๋ ๋ฒจ
- ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ๋ถ๋ฌ์จ๋ค. (= ๋ฐ๋ณตํด์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค)
- REPEATABLE READ (lv.2)
- ํธ๋์ญ์
๋์์๋ ํ๋ฒ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์กฐํํด๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋์ค์ง๋ง, ๋ง์ฝ ๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ๊ธฐ์กด ํธ๋์ญ์
์์ ๋ฐ๋ณต ์กฐํํ๋ฉด ๊ฒฐ๊ณผ ์งํฉ์ด ์๋ก ์ถ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
- Dirty Read ๋ฐฉ์ง O, Non-Repeatable Read ๋ฐฉ์ง O, Phantom Read ๋ฐฉ์ง X
- ํธ๋์ญ์
๋์์๋ ํ๋ฒ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์กฐํํด๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋์ค์ง๋ง, ๋ง์ฝ ๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ๊ธฐ์กด ํธ๋์ญ์
์์ ๋ฐ๋ณต ์กฐํํ๋ฉด ๊ฒฐ๊ณผ ์งํฉ์ด ์๋ก ์ถ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
- SERIALIZABLE (lv.3)
- ๋ชจ๋ ํธ๋์ญ์ ์ ์์๋๋ก ์คํํ๋ค.
- Dirty Read ๋ฐฉ์ง O, Non-Repeatable Read ๋ฐฉ์ง O, Phantom Read ๋ฐฉ์ง O
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฉ๋ฆฌ ์์ค์ READ_COMMITED๋ก ๊ฐ์ ํ๋๋ฐ
๋ง์ฝ ์ผ๋ถ ๋ก์ง์ ๋ ๋์ ๊ฒฉ๋ฆฌ ์์ค์ด ํ์ํ๋ฉด ๋น๊ด์ ๋ฝ๊ณผ ๋๊ด์ ๋ฝ ์ค์ ์ ํ์ ํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค.
JPA์ ์ถ์ฒํ๋ ์ ๋ต์ READ_COMMITTED + ๋๊ด์ ๋ฝ ์ด๋ค.
- ๋๊ด์ ๋ฝ
- ํธ๋์ญ์ ๋๋ถ๋ถ์ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋ ๋ค๊ณ ๊ฐ์ ํ๋ฉฐ, JPA๊ฐ ์ ๊ณตํ๋ ๋ฒ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค. (์ดํ๋ฆฌ์ผ์ด์ ๋จ ๋ ๋ฒจ)
- ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ธฐ ์ ๊น์ง๋ ํธ๋์ญ์ ์ ์ถฉ๋์ ์ ์ ์๋ค๋ ํน์ง์ด ์๋ค.
- JPA์์ ์ ๊ณตํ๋ @Version ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉฐ, ์ต์ด ์ปค๋ฐ๋ง ์ธ์ ๋์ด ๋๋ฒ์งธ ์ปค๋ฐ์์ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
- ๋น๊ด์ ๋ฝ
- ํธ๋์ญ์ ๊ฐ ์ถฉ๋์ด ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ์ฌ ์ฐ์ ๋ฝ์ ๊ฑด๋ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๊ณตํ๋ ๋ฝ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ์ฆ์ ํธ๋์ญ์ ์ถฉ๋์ ๊ฐ์งํ๋ฉฐ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
- ๋น๊ด์ ๋ฝ์ ์ฌ์ฉํ๋ฉด ๋ฝ์ ํ๋ํ ๋๊น์ง ํธ๋์ญ์
์ด ๋๊ธฐํ๋ค. ๋ฌดํ์ ๊ธฐ๋ค๋ฆด ์ ์์ผ๋ฏ๋ก ํ์์์ ์๊ฐ์ ์ค ์ ์๋ค.
JPA์ ์ถ์ฒํ๋ ์ ๋ต์ READ_COMMITTED + ๋๊ด์ ๋ฝ ์ด๋ค.
'๊ฐ๋ฐ์ค > Java Persistence API (JPA)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๋ค๋ฅธ ์ปฌ๋ผ๋ช ์ ์ฐธ์กฐํ๋ ์ฐ๊ด๊ด๊ณ์ ๋ํ ๊ถ๊ตผ์ (referencedColumnName) (0) | 2023.02.13 |
---|---|
Criteria API ์ ๋ํด ์์๋ณด๊ธฐ (0) | 2023.01.27 |
JPA ( Java Persistence API ) (0) | 2023.01.10 |
[Spring] JPA Specification ๋ฅผ ์ด์ฉํด ๊ฒ์ API ๊ฐ๋ฐํ๊ธฐ โ (0) | 2022.12.05 |
[JPA] JPA ์ ์ฅ์ ์ด ๋ญ์ง ๋ฌผ์ด๋ดค์ ๋ ์ ๋๋ตํ์ง ๋ชปํ๋ค. . . (1) | 2022.09.23 |