[Spring] Spring @Transactional ์ธ๋ถ ์ค์
๐น Spring Transaction์ ์ธ๋ถ ์ค์
Spring์์ @Transactional ์ธ๋ถ ์ค์ ํ ๋, ์ง์ํ๋ ์ฃผ์ ์์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ ํ ์์ฑ (Propagation)
- ๊ฒฉ๋ฆฌ ์์ค (Isolation Level)
- ์ฝ๊ธฐ ์ ์ฉ ์ฌ๋ถ (Read-Only Flag)
- ์ ํ ์๊ฐ (Timeout)
- ํธ๋์ญ์ ๋กค๋ฐฑ ์์ธ ์ค์ (Rollback For, No Rollback For)
[ ์ ํ ์์ฑ (Propagation) ]
Spring์ด ์ ๊ณตํ๋ ์ ์ธ์ ํธ๋์ญ์
(@Transactional)์ ์ฅ์ ์ค ํ๋๋ ์ฌ๋ฌ ํธ๋์ญ์
์ ์ ์ฉ ๋ฒ์๋ฅผ ํ๋๋ก ๋ฌถ์ด, ํฐ ํธ๋์ญ์
๊ฒฝ๊ณ๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ ์ด๋ค.
ํธ๋์ญ์ ์ด ์ด๋ป๊ฒ ๋์ํ ์ง ๊ฒฐ์ ํ๋ ค๋ฉด ์ ํ ์์ฑ (Propagation)์ ์ค์ ํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์๋ก์ด ํธ๋์ญ์ ์ ์์ํ ์ง, ๊ธฐ์กด ํธ๋์ญ์ ์ ์ฐธ์ฌํ ์ง ๋ฑ์ ์ ์ดํ ์ ์๋ค.
[ ์ ํ ์์ฑ ๋ชฉ๋ก ]
- REQUIRED
- SUPPORTS
- MANDATORY
- REQUIRES_NEW
- NOT_SUPPORTED
- NEVER
- NESTED
โฝ REQUIRED (๊ธฐ๋ณธ ์ ํ ์์ฑ)
- REQUIRED๋ ํธ๋์ญ์ ์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด ํด๋น ํธ๋์ญ์ ์ ์ฌ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด ์๋ก์ด ํธ๋์ญ์ ์ ์์ฑํ๋ ๋ฐฉ์์ด๋ค.
- ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๋ฉฐ ์์ฐ์ค๋ฌ์ด ํธ๋์ญ์ ์ ํ ๋ฐฉ์์ด๋ฉฐ, ๋ชจ๋ ํธ๋์ญ์ ๋งค๋์ ๊ฐ ์ง์ํ๋ค.
- ํ๋์ ํธ๋์ญ์ ์ด ์์๋ ํ, ๋ค๋ฅธ ํธ๋์ญ์ ๊ฒฝ๊ณ๊ฐ ์ค์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์๋์ผ๋ก ๋์ผํ ํธ๋์ญ์ ์ ๋ฌถ์ธ๋ค.
โฝ SUPPORTS
- SUPPORTS๋ ํธ๋์ญ์ ์ด ์ด๋ฏธ ์์๋ ๊ฒฝ์ฐ ์ฐธ์ฌํ์ง๋ง, ๊ทธ๋ ์ง ์์ผ๋ฉด ํธ๋์ญ์ ์์ด ์คํ๋๋ค.
- ํธ๋์ญ์ ์ด ์์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ(Connection)์ด๋ Hibernate์ ์ธ์ (Session)์ ๊ณต์ ํ ์ ์๋ค.
- ์ค์ํ ์์ ์์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ํธ๋์ญ์ ์ด ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ ์ ํ๋ค.
โฝ MANDATORY
- MANDATORY๋ ๋ฐ๋์ ๊ธฐ์กด ํธ๋์ญ์ ์ด ์กด์ฌํด์ผ ํ๋ฉฐ, ์์ผ๋ฉด ์์ธ(TransactionRequiredException)๊ฐ ๋ฐ์ํ๋ค.
- ์ฆ, ์๋ก์ด ํธ๋์ญ์ ์ ์์ฑํ์ง ์๊ณ , ๋ฐ๋์ ๊ธฐ์กด ํธ๋์ญ์ ๋ด์์๋ง ์คํ๋๋ค.
- ๋ถ๋ชจ ํธ๋์ญ์ ์ด ํ์์ ์ธ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉฐ, ๋ ๋ฆฝ์ ์ธ ํธ๋์ญ์ ์คํ์ด ํ์ฉ๋์ง ์๋ ์ํฉ์ ์ ํฉํ๋ค.
โฝ REQUIRES_NEW
- REQUIRES_NEW๋ ํญ์ ์๋ก์ด ํธ๋์ญ์ ์ ์์ฑํ๋ฉฐ, ๊ธฐ์กด ํธ๋์ญ์ ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ผ์์ ์ผ๋ก ๋ณด๋ฅ(suspend)ํ๋ค.
- ์ฆ, ๋ถ๋ชจ ํธ๋์ญ์ ๊ณผ ๋ณ๊ฐ์ ํธ๋์ญ์ ์ผ๋ก ์คํ๋๋ฉฐ, ๊ธฐ์กด ํธ๋์ญ์ ๊ณผ ๋ ๋ฆฝ์ ์ธ ์ปค๋ฐ/๋กค๋ฐฑ์ด ๊ฐ๋ฅํ๋ค.
- JTA(Java Transaction API) ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํธ๋์ญ์ ๋ณด๋ฅ ๊ธฐ๋ฅ์ด ์ง์๋์ด์ผ ํ๋ค.
โฝ NOT_SUPPORTED
- NOT_SUPPORTED๋ ํ์ฌ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด ์๋ค๋ฉด, ์ด๋ฅผ ๋ณด๋ฅ(suspend)์ํค๊ณ , ํธ๋์ญ์ ์์ด ์คํํ๋ค.
- ํธ๋์ญ์ ์ด ํ์ ์๋ ์์ (๋๋ ๋ฐ์ดํฐ ์กฐํ ๋ฑ)์ ์ ํฉํ๋ฉฐ, ํธ๋์ญ์ ์ด ๋ถํ์ํ ์๋น์ค ๋ ์ด์ด์์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค.
โฝ NEVER
- NEVER๋ ํ์ฌ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด ์กด์ฌํ๋ฉด ์์ธ(IllegalTransactionStateException)๋ฅผ ๋ฐ์์ํจ๋ค.
- ํธ๋์ญ์ ์ด ์ ๋ ํฌํจ๋๋ฉด ํ ๋๋ ์์ (๋ก๊น , ๋ชจ๋ํฐ๋ง, ๋จ์ ์กฐํ ๋ฑ)์์ ์ฌ์ฉํ๋ค.
โฝ NESTED
- NESTED๋ ํ์ฌ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ๊ทธ ๋ด๋ถ์์ ์ค์ฒฉ ํธ๋์ญ์ ์ ์์ํ๋ ๋ฐฉ์์ด๋ค.
- ์ค์ฒฉ ํธ๋์ญ์
์ ๋ถ๋ชจ ํธ๋์ญ์
์ ์ปค๋ฐ๊ณผ ๋กค๋ฐฑ์ ์ํฅ์ ๋ฐ์ง๋ง, ์์ ๋ง ๋กค๋ฐฑํ ์๋ ์์ผ๋ฉฐ ๋ถ๋ชจ ํธ๋์ญ์
์ ๊ฐ์ ๋ก ์ปค๋ฐํ๊ฑฐ๋ ๋กค๋ฐฑ์ํค์ง ์๋๋ค.
- REQUIRES_NEW์์; ์ฐจ์ด์
- REQUIRES_NEW๋ ์์ ํ ์๋ก์ด ํธ๋์ญ์ ์ ์์ฑํ์ฌ ๋ถ๋ชจ ํธ๋์ญ์ ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค.
- ๋ฐ๋ฉด, NESTED๋ ๋ถ๋ชจ ํธ๋์ญ์ ๋ด์์ ์คํ๋๋ฉฐ, ๋ถ๋ชจ ํธ๋์ญ์ ์ ์ํฅ์ ๋ฐ์ง๋ง, ์์ ๋ง ๋กค๋ฐฑํ ์๋ ์๋ค.
์๋ฅผ ๋ค์ด, ์ค์ํ ์์ ์ ์ํํ๋ฉด์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํด ๋ณด์.
- ๋ฉ์ธ ํธ๋์ญ์ ์์ ์ค์ํ ์์ ์ ์ํํ๊ณ , ์ค์ฒฉ ํธ๋์ญ์ ์์ ๋ก๊ทธ๋ฅผ ์ ์ฅํ๋ค.
- ๋ง์ฝ ๋ก๊ทธ ์ ์ฅ์ด ์คํจํ๋๋ผ๋, ๋ฉ์ธ ์์ ์ ๊ทธ๋๋ก ์งํ๋์ด์ผ ํ๋ค.
- ํ์ง๋ง, ํต์ฌ ์์ ์ด ์คํจํ๋ฉด, ์ ์ฅ๋ ๋ก๊ทธ๋ ํจ๊ป ๋กค๋ฐฑ๋์ด์ผ ํ๋ค
@Service
public class TransactionService {
@Transactional(propagation = Propagation.NESTED)
public void saveLog() {
// ๋ก๊ทธ ์ ์ฅ ๋ก์ง (์ด ์์
๋ง ๋กค๋ฐฑ๋ ์ ์์)
}
@Transactional
public void processImportantTask() {
// ์ค์ํ ์์
์ํ
saveLog(); // ์ค์ฒฉ ํธ๋์ญ์
์คํ
}
}
์ด๋ฐ ๋ฐฉ์์ผ๋ก NESTED๋ฅผ ์ฌ์ฉํ๋ค๋ฉด,
- ๋ฉ์ธ ์์ ์ด ์คํจํ๋ฉด, ์ค์ฒฉ ํธ๋์ญ์ (๋ก๊ทธ ์ ์ฅ)๋ ๋กค๋ฐฑ๋๋ค.
- ๋ฐ๋ฉด, ๋ก๊ทธ ์ ์ฅ์ด ์คํจํด๋, ๋ฉ์ธ ์์ ์ ์ ์์ ์ผ๋ก ์งํ๋๋ค.
NESTED ์ ํ ์์ฑ์ ์ฌ์ฉํ๋ ค๋ฉด, JDBC 3.0์ ์ ์ฅ ํฌ์ธํธ(Savepoint)๋ฅผ ์ง์ํ๋ ํธ๋์ญ์ ๋งค๋์ ๊ฐ ํ์ํ๋ค.
์ฆ, ๋ชจ๋ ํธ๋์ญ์ ๋งค๋์ ์์ ์ง์๋๋ ๊ฒ์ ์๋๋ฏ๋ก, ์ฌ์ฉ ์ ์ ํ๊ฒฝ์ ํ์ธํด์ผ ํ๋ค.
[ ์ ์ฉ ๊ฐ๋ฅ ํ๊ฒฝ ]
- DataSourceTransactionManager ์ฌ์ฉ (JDBC ๋๋ผ์ด๋ฒ๊ฐ Savepoint ๊ธฐ๋ฅ์ ์ง์ํด์ผ ํจ)
- JTA(Java Transaction API) ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ถ WAS(Web Application Server)
์ ์ธ์ ํธ๋์ญ์ ์์๋ @Transactional ์ด๋ ธํ ์ด์ ์ propagation ์จ๋ฆฌ๋จผํธ๋ก ์ํ๋ ์ ํ ์์ฑ์ ์ง์ ํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ REQUIRED๋ก ์ค์ ๋์ด ์๋ค.
๋ํ, Spring์ 7๊ฐ์ง ์ ํ ์์ฑ์ ์ง์ํ์ง๋ง, ํด๋น ์์ฑ์ ์ง์ํ์ง ์๋ ํธ๋์ญ์ ๋งค๋์ ๋ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ด ์์ ์ ์์ผ๋ฏ๋ก, ์ ํ ์์ฑ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ ์ค์ธ ํธ๋์ญ์ ๋งค๋์ ๋ ๊ธฐ์ ์ ๋ํด ๋ณ๋์ ์ค์ ์ด ํ์ํ์ง ํ์ธํด์ผ ํ๋ค.
[ ๊ฒฉ๋ฆฌ ์์ค (Isolation Level) ]
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋ ๋, ๊ฐ ํธ๋์ญ์ ์ ์์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ด๋ป๊ฒ ๋ ธ์ถ๋ ์ง ๊ฒฐ์ ํ๋ ์ค์ ์ด๋ค. ๊ฒฉ๋ฆฌ ์์ค์ด ๋์์๋ก ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ง๋ง, ๋์์ฑ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
[ ๊ฒฉ๋ฆฌ ์์ค ๋ชฉ๋ก ]
- DEFAULT
- READ_UNCOMMITTED
- READ_COMMITTED
- REPEATABLE_READ
- SERIALIZABLE
โฝ DEFAULT
- DEFAULT๋ ์ฌ์ฉ ์ค์ธ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ด๋ DB ๋๋ผ์ด๋ฒ์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋ฅธ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก DB์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค์ READ_COMMITTED์ด์ง๋ง, ์ผ๋ถ DB์์๋ ๊ธฐ๋ณธ ์ค์ ๊ฐ์ด ๋ค๋ฅผ ์ ์๋ค.
- ๋ฐ๋ผ์ DEFAULT๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, DB ๋๋ผ์ด๋ฒ ๋ฐ DBMS์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋์ ํ์ธํด์ผ ํ๋ค.
โฝ READ_UNCOMMITTED
- READ_UNCOMMITTED๋ ๊ฐ์ฅ ๋ฎ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก, ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๊ธฐ ์ ์ ๋ฐ์ํ ๋ณ๊ฒฝ ์ฌํญ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์กฐํ๋ ์ ์๋ค.
- ์ฆ, Dirty Read(๋ํฐ ๋ฆฌ๋) ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ง ์๋๋ค.
- ํ์ง๋ง, ๊ฒฉ๋ฆฌ ์์ค์ด ๋ฎ์์๋ก ์ฑ๋ฅ์ด ํฅ์๋๋ฏ๋ก, ๋ฐ์ดํฐ ์ ํฉ์ฑ๋ณด๋ค ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ์ ์๋์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค.
โฝ READ_COMMITTED
- READ_COMMITTED๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก, ์ปค๋ฐ์ด ์๋ฃ๋ ๋ฐ์ดํฐ๋ง ์ฝ์ ์ ์๋๋ก ๋ณด์ฅํ๋ค.
- ์ฆ, ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์์ง ์ปค๋ฐํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
- ํ์ง๋ง ํธ๋์ญ์ ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์กฐํํ ๋, ๊ทธ ์ฌ์ด์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์๋ก ๋ค๋ฅธ ๊ฐ์ ์ฝ์ ์๋ ์๋ค. ์ด๋ฌํ ํ์์ Non-Repeatable Read(๋น๋ฐ๋ณต ์ฝ๊ธฐ) ๋ฌธ์ ๋ผ๊ณ ํ๋ค.
- Spring์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค์ DEFAULT์ด์ง๋ง, ๋๋ถ๋ถ์ DBMS๋ READ_COMMITTED๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ธ๋ค.
โฝ REPEATABLE_READ
- REPEATABLE_READ๋ ํ๋์ ํธ๋์ญ์ ์ด ์กฐํํ ๋ฐ์ดํฐ(row)๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์์ ํ ์ ์๋๋ก ๋ณด์ฅํ๋ค.
- ์ฆ, ํธ๋์ญ์ ์ด ์งํ๋๋ ๋์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด ํญ์ ๋์ผํ ๊ฐ์ ๋ฐํ๋ฐ๋๋ค.
- ํ์ง๋ง ์๋ก์ด ๋ฐ์ดํฐ(row)๋ฅผ ์ถ๊ฐ(INSERT)ํ๋ ๊ฒ์ ํ์ฉ๋๋ค.
- ๋ฐ๋ผ์, SELECT๋ฌธ์ ํตํด ํน์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ ๋, ํธ๋์ญ์ ์ด ๋๋๊ธฐ ์ ์ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ฉด ์ด๋ฅผ ๋ฐ๊ฒฌํ ์ ์๋ค. ์ด๋ฌํ ํ์์ Phantom Read(ํฌํ ๋ฆฌ๋) ๋ฌธ์ ๋ผ๊ณ ํ๋ค.
โฝ SERIALIZABLE
- SERIALIZABLE๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก, ๋ชจ๋ ํธ๋์ญ์ ์ ์์ฐจ์ ์ผ๋ก ์คํํ๋๋ก ๊ฐ์ ํ๋ค.
- ์ฆ, ํ๋์ ํธ๋์ญ์ ์ด ์๋ฃ๋๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
- ์ด ๊ฒฉ๋ฆฌ ์์ค์์๋ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ํธ๋์ญ์ ์ด ์ง๋ ฌํ๋์ด ์คํ๋๋ฏ๋ก, Dirty Read, Non-Repeatable Read, Phantom Read ๋ฌธ์ ๊ฐ ๋ชจ๋ ๋ฐฉ์ง๋๋ค.
- ํ์ง๋ง, ๋์์ฑ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ ์ ์์ด, ๊ทน๋๋ก ๋์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ค.
์ ์ธ์ ํธ๋์ญ์ ์์๋ @Transactional ์ด๋ ธํ ์ด์ ์ isolation ์จ๋ฆฌ๋จผํธ๋ก ์ํ๋ ๊ฒฉ๋ฆฌ ์์ค์ ์ง์ ํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ ๊ฐ์ DEFAULT๋ก ์ค์ ๋์ด ์๋ค.
@Transactional(isolation = Isolation.DEFAULT)
@Transactional(isolation = Isolation.READ_COMMITTED)
[ ์ฝ๊ธฐ ์ ์ฉ ์ฌ๋ถ (Read-Only Flag) ]
@Transactional(readOnly=true)
Spring์์๋ ํธ๋์ญ์ ์ ๋ค์ ๋ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก ์ฝ๊ธฐ ์ ์ฉ(Read-Only)์ผ๋ก ์ค์ ํ ์ ์๋ค.
- ์ฑ๋ฅ ์ต์ ํ : ๋ถํ์ํ ํธ๋์ญ์ ๋ฆฌ์์ค๋ฅผ ์ต์ํํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
- ์ฐ๊ธฐ ๋ฐฉ์ง : ์๋ํ์ง ์์ INSERT, UPDATE, DELETE ์์ ์ ๋ฐฉ์งํ๋ค.
ํธ๋์ญ์ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ๋ฉด, ํด๋น ์ ๋ณด๊ฐ ํธ๋์ญ์ ๋งค๋์ ์๊ฒ ์ ๋ฌ๋๋ฉฐ, ํธ๋์ญ์ ๋งค๋์ ๋ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ต์ ํ๋ ์์ ์ ์ํํ๋ค.
๋ค๋ง, ์ผ๋ถ ํธ๋์ญ์ ๋งค๋์ ๋ ์ฝ๊ธฐ ์ ์ฉ ์ค์ ์ ๋ฌด์ํ๊ณ ์ฐ๊ธฐ ์์ ์ ํ์ฉํ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก, ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ๋ด์์ INSERT, UPDATE, DELETE ์์ ์ด ์ํ๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.
[ ์ ํ ์๊ฐ (Timeout) ]
@Transactional(timeout=10)
timeout ์์ฑ์ ์ด์ฉํ๋ฉด ํธ๋์ญ์ ์ ์ ํ ์๊ฐ์ ์ง์ ํ ์ ์๋ค. ๊ฐ์ ์ด ๋จ์์ ์ ์(int)๋ก ์ง์ ํ ์ ์๋ค. ๋ง์ฝ ๋ฌธ์์ด๋ก ์ง์ ํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด timeoutString์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ ํ ์๊ฐ์ ๋ณ๋๋ก ์ง์ ํ์ง ์์ผ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋์ญ์ ์์คํ ์ ์ ํ ์๊ฐ์ด ์ ์ฉ๋๋ค. ๋ํ, ํธ๋์ญ์ ๋งค๋์ ์์ ์ด ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ, ์ ํ ์๊ฐ์ ์ค์ ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
[ ํธ๋์ญ์ ๋กค๋ฐฑ ์์ธ ์ค์ (Rollback For, No Rollback For) ]
// MyException ๋ฐ์ ์ ํธ๋์ญ์
๋กค๋ฐฑ
@Transactional(rollbackFor=MyException.class)
// MyException ๋ฐ์ ์ ํธ๋์ญ์
๋กค๋ฐฑ X
@Transactional(noRollbackFor=MyException.class)
์ ์ธ์ ํธ๋์ญ์ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐํ์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑํ๊ณ , ์์ธ๊ฐ ๋ฐ์ํ์ง ์๊ฑฐ๋ ์ฒดํฌ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ปค๋ฐํ๋ค.
์ฌ๊ธฐ์ ์ฒดํฌ ์์ธ๋ฅผ ์ปค๋ฐ ๋์์ผ๋ก ์ผ์ ์ด์ ๋, ์ฒดํฌ ์์ธ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์์ธ์ ์ธ ์ํฉ๋ณด๋ค๋ ๋น์ฆ๋์ค ๋ก์ง์์์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ด๋ค.
Spring์์๋ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ด๋ จ ์์ธ๋ฅผ ๋ฐํ์ ์์ธ๋ก ์ ํํ์ฌ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐํ์ ์์ธ๋ง ๋กค๋ฐฑ ๋์์ผ๋ก ์ค์ ๋๋ค.
ํ์ง๋ง ํธ๋์ญ์ ์ ๋กค๋ฐฑ/์ปค๋ฐ ๋์ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ค์ ์ ํตํด ๋์ ๋ฐฉ์์ ์์ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ์ปค๋ฐ ๋์์ผ๋ก ์ผ๊ณ ์ถ์ ์ฒดํฌ ์์ธ๋ ํด๋์ค๋ฅผ ์ง์ ํ๋ ค๋ฉด rollbackFor ๋๋ rollbackForClassName์ ์ฌ์ฉํ๊ณ , ๋กค๋ฐฑ ๋์์ธ ๋ฐํ์ ์์ธ๋ฅผ ์ปค๋ฐ ๋์์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด noRollbackFor ๋๋ noRollbackForClassName์ ์ฌ์ฉํ๋ค.
์์์ ์ค๋ช ํ ๋ชจ๋ ํธ๋์ญ์ ์์ฑ๋ค์ ๊ฐ ํธ๋์ญ์ ๊ฒฝ๊ณ ์ค์ ์์ ์ง์ ํ ์ ์๋ค.
ํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, readOnly ์์ฑ๋ง ํ์ฉํ๊ณ ๋๋จธ์ง๋ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ธ๋ฐํ ์์ฑ์ DBMS๋ WAS์ ํธ๋์ญ์ ๋งค๋์ ์ค์ ์ ํตํด ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ reference