์น ๋ฐ์ดํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋, dao์์ sql๋ฌธ์ผ๋ก db์ ์ ๊ทผํ๊ณ service์์ dao ๋ฉ์๋๋ค์ ์ด์ฉํ์ฌ ํ๋์ ํธ๋์ญ์ ์ ๊ด๋ฆฌํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ช ์ด์ ๋์์ ์ฌ์ฉํ๋ค๋ฉด? ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋์์ฑ ๋ฌธ์ ๋, ๋ ๊ฐ ์ด์์ ์ธ์ ์ด ๊ณตํต๋ ์์์ ์ฝ๊ณ ์ธ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด๋ฌํ ๋์์ฑ ๋ฌธ์ ์ ํธ๋์ญ์ ์ ๋ํด์ ์์๋ณด๊ณ , @Transactional ์ด๋ ธํ ์ด์ ์ผ๋ก ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฒ์ ๋ํด ์์๋ณด์์ต๋๋ค
ํธ๋์ญ์ ์ด๋?
DBMS์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์์ ์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฉ์ด์ ์ ์๋ก๋ ์ดํดํ๊ธฐ ์ด๋ ต์ง๋ง, ํธ๋์ญ์ ์ ์ฑ์ง์ ์์๋ณด๋ฉด ๋ณด๋ค ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ ๋๋ค. ์๋ ์์์ฝ๋ ์ ๋๋ค.
Service layer์์ ์ฒด์ค๋ง์ ์์ง์ด๋ ์ฝ๋์ผ ๋,
์ move ๋ฉ์๋์๋ 3๊ฐ์ sql ์ฟผ๋ฆฌ๋ฌธ์ด ์กด์ฌํฉ๋๋ค.
์๋๋ง์ deleteํด์ฃผ๋ ์ฟผ๋ฆฌ๋ฌธ, ํ์ฌ๋ง์ updateํด์ฃผ๋ ์ฟผ๋ฆฌ๋ฌธ, turn์ updateํด์ฃผ๋ ์ฟผ๋ฆฌ๋ฌธ.
์ด ๋ฌถ์๋ค, ์ฆ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์์ ๋จ์๋ฅผ transaction, ํธ๋์ญ์ ์ด๋ผ ํฉ๋๋ค.
๋ง์ฝ ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋์ง ์์์ move ๋ฉ์๋๊ฐ ์คํ๋ ๋ turn์ด update๋์ง ์๊ณ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฌธ๋ง ์คํ๋๊ฑฐ๋, piece๋ง update๋๊ณ turn์ด ๋ฐ๋์ง ์๋๋ค๋ฉด ์ฌ์ฉ์์๊ฒ ํฐ ํผ๋์ ์ ๋ฐํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ํธ๋์ญ์ ์ ํ ๋ฒ ์คํ๋ ๋ ๊ทธ ์์ ์์ ๋ค์ด ๋ชจ๋ ์ํ๋๊ฑฐ๋ ์ํ๋์ง ์์์ผ ํ๋ฉฐ, ๋ค๋ฅธ ํธ๋์ญ์ ๊ณผ์ ์ถฉ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋์ ํผํด์ผ ํ๋ค. ๋ค๋ฅธ ํธ๋์ญ์ ๊ณผ์ ์ถฉ๋ ๋ฌธ์ ๊ฐ ๋ฐ๋ก ๋์์ฑ ๋ฌธ์ ์ ๋๋ค.
ํธ๋์ญ์ ์คํ ๋์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ ํธ๋์ญ์ ์ ํฌํจ๋ ์์ ๋ค์ ๋ชจ๋ rollback๋ผ์ผ ํฉ๋๋ค.
์ด๋ฌํ ํธ๋์ญ์ ์ ์ฑ์ง๋ค์ ์ ๋ฆฌํ ๊ฒ์ ํธ๋์ญ์ ACID ์ฑ์ง์ด๋ผ ํฉ๋๋ค.
๋์์ฑ ๋ฌธ์ ์ข ๋ฅ
๋ ๊ฐ ์ด์์ ์ธ์ ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ข ๋ฅ๋ฅผ ์์๋ณด๋ฉด
ํธ๋์ญ์ 1: ์ฝ๊ธฐ ์์ / ํธ๋์ญ์ 2: ์ฐ๊ธฐ ์์ ์ ํ๋ค๊ณ ๊ฐ์ ํ์ ๋.
ํธ๋์ญ์ ๋ ๊ฐ๊ฐ ๋ชจ๋ ์ฝ๊ธฐ ์์ ์ ํ ๋์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๊ณ , ํธ๋์ญ์ ๋ ๊ฐ๊ฐ ๋ชจ๋ ์ฐ๊ธฐ ์์ ์ ํ ๋์๋ Exclusive lock(์ฐ๊ธฐ ๋ฝ)์ผ๋ก ์์ ์ ๊ทผ์ ๋ง์ต๋๋ค.
๋ฐ๋ผ์ ๊ฐ๊ฐ ์ฝ๊ธฐ, ์ฐ๊ธฐ ์์ ์ ์ํํ ๋ ๊ฒฉ๋ฆฌ๋ ๋ฒจ์ ์ ์ค์ ํด์ฃผ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
Dirty Read
ํธ๋์ญ์ 1์ด ํธ๋์ญ์ 2์์ ์์ ํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋ค๊ณ ๊ฐ์ ํ์ ๋.
์ด ๋, ํธ๋์ญ์ 2๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ ์์ง ํธ๋์ญ์ ์ปค๋ฐ์ ํ์ง ์์๋ค๊ณ ํ ๊ฒฝ์ฐ
๊ทธ๋ฐ๋ฐ ํธ๋์ญ์ 2์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก rollbackํ๊ณ ์ปค๋ฐ์ ํ์ต๋๋ค.
ํธ๋์ญ์ 1์ ํธ๋์ญ์ 2์์ ์ปค๋ฐํ์ง๋ ์์ (rollback ์ ) ๋ฐ์ดํฐ๊ฐ ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ Dirty Read๋ผ๊ณ ํฉ๋๋ค.
ํธ๋์ญ์ 1์ 1๋ฒ ์ ์ ์ ๋์ด๊ฐ 21์ด๋ก ์คํดํ ์ฑ ๊ฐ๋ฐํฉ๋๋ค.
์์ ์์์์ Transaction 2๋ commit์ ํ์ง ์๊ณ ์์ ํ๊ณ ์๊ณ . ์ฆ, ํธ๋์ญ์ 2๋ ์์ง ๋๋์ง ์๊ณ ์งํ์ค์ธ ๊ฒ์ ๋๋ค.
์ด ์ํฉ์์ ํธ๋์ญ์ 1์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ์๊ณ , ํธ๋์ญ์ 2๋ ์์ง ํด๋น ์์ ์ ๊ณ์ ์์ ์ค (commit ์ )์ ์์ผ๋ฏ๋ก ํธ๋์ญ์ 1์ ์ฌ๋ฐ๋ฅด์ง ์์ ๋ฐ์ดํฐ ๊ฐ์ ๊ณ์ํด์ ์กฐํํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ปค๋ฐํ์ง ์์ ์์ ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ ์ํฉ ์์ฒด๊ฐ ๋ฌธ์ ์ธ ๊ฒ์ ๋๋ค.
Non-repeatable Read (๋ฐ๋ณต ๋ถ๊ฐ๋ฅ ์ฝ๊ธฐ)
ํธ๋์ญ์ 1์ด ํธ๋์ญ์ 2์์ ์์ ํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋ค๊ณ ๊ฐ์ ํ์ ๋
๊ทธ๋ฐ๋ฐ ํธ๋์ญ์ 2์์ ๊ฐ์๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ . ๊ทธ๋ฆฌ๊ณ ์ด ๋ณ๊ฒฝํ ๋ฐ์ดํฐ๋ฅผ ์ปค๋ฐํ์ ๊ฒฝ์ฐ. (์์ Dirty Read ์ํฉ๊ณผ๋ ๋ค๋ฅด๊ฒ ํธ๋์ญ์ 2์์ ์์ ์ ๋๋ด๊ณ commit์ ํ๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.)
ํ์ง๋ง ํธ๋์ญ์ 1์ ์์ง commit ํ์ง ์์ ํด๋น ํธ๋์ญ์ ๋ด์์ ์์ ์ค์ธ ์ํ์ ์์ต๋๋ค.
ํธ๋์ญ์ 1์ ํด๋น ํธ๋์ญ์ ๋ด์์ updateํ๊ธฐ ์ ๋ฐ์ดํฐ, updateํ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์กฐํํ๊ฒ ๋๋ฏ๋ก ํผ๋์ด ์ฌ ์ ์๊ฒ ๋๋๋ฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ Non-repeatable Read๋ผ๊ณ ํ๋ค.
ํธ๋์ญ์ 1์ ์๋ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์๊ณ ์๋ ์ํ์์, ํธ๋์ญ์ 2๊ฐ ์์ ํ ๋ฐ์ดํฐ ๊ฐ์ ์ฝ๊ฒ ๋ฉ๋๋ค.
Phantom Read (์ ๋ น ๋ฐ์ดํฐ ์ฝ๊ธฐ)
ํธ๋์ญ์ 1์ด ํธ๋์ญ์ 2๊ฐ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ฝ์๋ค๊ณ ํ์ ๋
๊ทธ๋ฐ๋ฐ ํธ๋์ญ์ 2์์ ์ถ๊ฐ๋ก ๋ฐ์ดํฐ๋ฅผ insertํ๊ณ , ์ด ๋ณ๊ฒฝํ ๋ฐ์ดํฐ๋ฅผ ์ปค๋ฐํ์ต๋๋ค.
(์์ Non-repeatable Read ์ํฉ๊ณผ๋ ๋ค๋ฅด๊ฒ insert ์์ ์ ํ๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.)
ํ์ง๋ง ํธ๋์ญ์ 1์ ์์ง commit ํ์ง ์์ ํด๋น ํธ๋์ญ์ ๋ด์์ ์์ ์ค์ธ ์ํ์ ์์ต๋๋ค.
ํธ๋์ญ์ 1์ ํด๋น ํธ๋์ญ์ ๋ด์์ Insert๋ ์ ๋ น ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋๋๋ฐ, ์ด๋ฌํ ๋ฌธ์ ๋ฅผ Phantom Read๋ผ๊ณ ํฉ๋๋ค.
ํธ๋์ญ์ 1์ ์๋ ์กด์ฌํ์ง ์์๋, ํธ๋์ญ์ 2๊ฐ ์ถ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค.
@Transactional ์ด๋ ธํ ์ด์
์คํ๋ง์ @Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ํธ๋์ญ์ ๊ด๋ จ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ rollback์ํฌ ์ ์์ผ๋ฉฐ, ๋์์ฑ ๋ฌธ์ ์ ๋ํ ๊ฑฑ์ ๋ ํด๊ฒฐํ ์ ์์ต๋๋ค.
Level | Dirty Read | Non-repeatable Read | Phantom Read | |
READ UNCOMMITED | 0 | O | O | O |
READ COMMITED | 1 | X | O | O |
REPEATABLE READ | 2 | X | X | O |
SERIALIZABLE | 3 | X | X | X |
ํธ๋์ญ์ ๊ณ ๋ฆฝ ๋ ๋ฒจ์ ์ค์ ํด์ค ๋, ์ฝ๊ธฐ ๊ธฐ๋ฅ์ ์ ํํ๋ ๊ณต์ ๋ฝ๊ณผ ์ฝ๊ธฐ/์ฐ๊ธฐ ๊ธฐ๋ฅ์ ์ ํํ๋ ๋ฐฐํ๋ฝ์ ์ด์ฉํ์ฌ ์ค์ ํด์ค๋๋ค.
READ UNCOMMITED
- ๊ณ ๋ฆฝ ์์ค์ด Level 0์ผ๋ก ๊ฐ์ฅ ๋ฎ์ ๋ช ๋ น์ด๋ก, ์์ ์ ๋ฐ์ดํฐ์ ์๋ฌด๋ฐ ๊ณต์ ๋ฝ์ ๊ฑธ์ง ์๋๋ค.
READ UNCOMMITTED๋ ์์ ์ ๋ฐ์ดํฐ์ ์๋ฌด๋ฐ ๊ณต์ ๋ฝ๋ ๊ฑธ์ง ์์ง๋ง ๋ฐฐํ๋ฝ์ ๋ฐ์ดํฐ์ ๊ฐฑ์ ์์ค ๋ฌธ์ ๋๋ฌธ์ ๊ฑธ์ด์ฃผ์ด์ผ ํฉ๋๋ค. ๋ํ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ณต์ ๋ฝ๊ณผ ๋ฐฐํ๋ฝ์ด ๊ฑธ๋ฆฐ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํ์ง ์๊ณ ์ฝ์ต๋๋ค. SELECT ๋ฌธ์ ์ํํ๋ ๊ฒฝ์ฐ ํด๋น ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ์ง ์๋ Level์ ๋๋ค. ๋ฐ๋ผ์, ์ด๋ค ์ฌ์ฉ์๊ฐ A๋ผ๋ ๋ฐ์ดํฐ๋ฅผ B๋ผ๋ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ B๋ผ๋ ์์ง ์๋ฃ๋์ง ์์ ๋ฐ์ดํฐ(์ค์ ๋ฐ์ดํฐ) B๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
๋จ์ํ @Transactional ์ด๋ ธํ ์ด์ ๋ง ๋ถ์ฌ์ฃผ๋ฉด ํธ๋์ญ์ ๊ณ ๋ฆฝ ๋ ๋ฒจ์ jdbc ๊ธฐ๋ณธ isolation level์ ๋ฐ๋ฅด๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ MYSQL์ ์ฌ์ฉ์ค์ด๋ผ๋ฉด defalut transaction isolation level์ 2, ORACLE์ ์ฌ์ฉํ๋ค๋ฉด 1, MariaDB๋ฅผ ์ฌ์ฉํ๋ค๋ฉด 2๊ฐ ๋๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๋ฐ๋์ ๊ณ ๋ฆฝ ๋ ๋ฒจ์ด ๋๋ค๊ณ ํด์ ์ข์ ๊ฒ์ ์๋๋ฉฐ,
๊ณ ๋ฆฝ์ฑ์ด ๋์์ง๋ (๋์์ฑ์ด ๋ฎ์์ง๋) ๋งํผ ์ฑ๋ฅ์ ๋จ์ด์ง๊ณ , ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ ํ๋๋ ์ ์ด ๋ง์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
@Transactional(readOnly = true)
@Transactional(readOnly = true)
public List<RoomDto> showRooms() {
return roomDao.findAll();
}
๋ง์ฝ ๋ฐ์ดํฐ๋ฅผ ๋จ์ ์ฝ๊ธฐ ์์ ๋ง ํ๋ ํธ๋์ญ์ ์ด๋ผ๋ฉด transaction์ readOnly ๊ฐ์ true๋ก ์ค์ ํด๋๋ฉด ์ฑ๋ฅ์ ๋ ๊ฐ์ ์ํฌ ์ ์์ต๋๋ค.
readOnly๋ก ์ค์ ํด๋๊ฒ ๋๋ฉด SELECT ๋ฌธ๋ง ์ง์ํ๊ฒ ๋๋ฉฐ, UPDATE, INSERT, DELETE ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ถํ์ํ ์ง์์ ๋ง์์ฃผ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ฌ ์ฑ๋ฅ ๊ฐ์ ์ด ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.
๋ํ, ํ ๊ฐ๋ฐ์๊ฐ ํด๋น ์ฝ๋๋ฅผ ๋ณด๊ณ ์ฝ๊ธฐ ์์ ๋ง ํ๋ ๋ฉ์๋์์ ๋ฐ๋ก ํ์ ํ ์ ์๋ค๋ ์ฅ์ ๋ ์กด์ฌํฉ๋๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
@JsonFilter๋ก ์ํ๋ ํ๋๋ง ๋ด๋ ค์ฃผ๊ธฐ (0) | 2023.04.12 |
---|---|
์์กด์ฑ ์ฃผ์ ์ ๋ค์ํ ๋ฐฉ๋ฒ (์์ฑ์ ์ฃผ์ , ํ๋ ์ฃผ์ , ์์ ์ ์ฃผ์ ) (0) | 2023.03.16 |
๋๊ธ