๐ ๋ค์ด๊ฐ๋ฉฐ
์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ํญ์ ๋์ค๋ ์๊ธฐ ์ค ํ๋๊ฐ ๋ฐ๋ก 'ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ' ์ ๋ํ ๋ด์ฉ์ ๋๋ค.
๊ทธ๋งํผ Exception์ด ๋ฐ์ํ์ ๋ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ์ ๋ํ ๋ด์ฉ์ด ์ค์ํ ๋งํผ ์ด์ ๋ํ ๋์ฒ ์ค ํ๋์ธ Transaction์ ๋ํด ์ ๋ฆฌํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ Transaction ์ ์ ์
ํธ๋์ญ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ๋๋ ํ๋ฒ์ ์ํ๋์ด์ผ ํ๋ ์ฐ์ฐ๋ค์ ๋ปํฉ๋๋ค.
์ฆ, ๋ณํ ์ ์ด ์ ์ฒ๋ฆฌ๋๋ ์์ ์ ๋ ผ๋ฆฌ์ ๋จ์์ ๋๋ค.
Transaction์ ํ๋์ ํ๋ฆ์ผ๋ก ํ๋์ ์คํ์ด ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ๋ฉด ๋ชจ๋ ์ฐ์ฐ๋ค์ ๋์ผํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
A, B, C์ ์ฐ์ฐ์ ํ ๋ฌถ์์ด๋ผ๊ณ ํ ๋ A๋ ์ ์ ์๋ ๋์ง๋ง,
B๊ฐ ์คํจํ๋ค๋ฉด A์ ์์ ์ด๋ ฅ๋ ์ด์ ์ผ๋ก ๋๋ฆฝ๋๋ค.
๋ชจ๋ ์์ ์ด ์ฑ๊ณตํ๋ค๋ฉด ์๋ฃ ์์ ์ํ๋ฅผ ๋ชจ๋ ๋ฐ์ํ๊ณ , ์ด๊ฒ์ Commit์ด๋ผ๊ณ ํฉ๋๋ค.
๋ฐ๋ฉด, ํ๋๋ผ๋ ์คํจํ๊ฒ ๋๋ค๋ฉด ๋ชจ๋ ์ฌํญ์ ํ๊ธฐํ๊ณ , ์ด๊ฒ์ Rollback์ด๋ผ๊ณ ํฉ๋๋ค.
๐ Transaction ์ 4๊ฐ์ง ์ฑ์ง
ํธ๋์ญ์ ์ 4๊ฐ์ง์ ์ฑ์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด๋ฅผ ACID ๋ผ๊ณ ํ๋๋ฐ ํด๋น ์ฑ์ง์ ์๋์ ๊ฐ์ต๋๋ค.
Atomicity ์์์ฑ
: ํ ํธ๋์ญ์ ๋ด์ ์คํ ์์ ์ ํ๋์ ๋จ์๋ก ์ฒ๋ฆฌํ๋ค. / ๋ชจ๋ ์ฑ๊ณต ๋๋ ๋ชจ๋ ์คํจ
Consistency ์ผ๊ด์ฑ
: ํธ๋์ญ์ ์ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ์ ์งํ๋ค.
โก๏ธ ํ๋์ ๋์์ด ์ ์์ ์ธ ํ๋ฆ์ ์ผ๊ด๋๊ฒ ์ ์งํ์ฌ์ผ ํ๋ค๋ ์์น์ ๋๋ค.
Isolation ๋ ๋ฆฝ์ฑ
: ๋์์ ์คํ๋๋ ํธ๋์ญ์ ๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๋ ๋ฆฝ๋์ด์ผ ํ๋ค.
โก๏ธ ๊ฒฉ๋ฆฌ์ฑ ์ด๋ผ๊ณ ๋ ํ๋ ์ด ์ฑ์ง์ ํ๋์ ๋์ ์ค ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ฐ์ ํ์ฌ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋์๋
์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. (ํ ๋์์ด ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ)
Durability ์์์ฑ
: ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ๋ง์น๋ฉด ๊ฒฐ๊ณผ๊ฐ ํญ์ ์ ์ฅ๋์ด์ผ ํ๋ค.
โก๏ธ ํธ๋์ญ์ ์ ๋์์ด ์ฑ๊ณต ํ Commit ๋๊ฒ ๋๋ค๋ฉด ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ํ ๋ฐ์๋์ด์ผ ํ๋ค๋ ์์น์ ๋๋ค.
๐ TransactionManager ์ ์ข ๋ฅ
โ๏ธ DataSourceTransactionManager
: JDBC ๋ฐ MyBatis ๋ฑ์ JDBC ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์ ์ด์ฉํฉ๋๋ค.
์ด ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํธ๋์ญ์ ์ ์ ์ฉํ DataSource๊ฐ ์คํ๋ง์ ๋น์ผ๋ก ๋ฑ๋ก๋์ด์ผ ํฉ๋๋ค.
ํ์ฌ ์ ๊ฐ ๋ค๋๊ณ ์๋ ํ์ฌ ๋๋ถ๋ถ์ ์๋ธ ๋๋ฉ์ธ์ด ์ด ๋ฐฉ์์ TransactionManager๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
โ๏ธ HibernateTransactionManager
: ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์ ์ด์ฉํฉ๋๋ค.
โ๏ธ JpaTransactionManager
: JPA๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์ ์ด์ฉํฉ๋๋ค.
JpaTransactionManager๋ LocalContainerEntityManagerFactoryBeanํ์ ์ ๋น์ ๋ฑ๋กํด์ค์ผํฉ๋๋ค.
โ๏ธ JtaTransactionManager
: ํ๋ ์ด์์ DB ๋ ๊ธ๋ก๋ฒ ํธ๋์ญ์ ์ ์ ์ฉํ๋ ค๋ฉด JTA ์ด์ฉํ ์ ์์ต๋๋ค.
JTA๋ ์ฌ๋ฌ ๊ฐ์ ํธ๋์ญ์ ๋ฆฌ์์ค(DB, JMS ๋ฑ)์ ๋ํ ์์ ์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ ์ ์๊ณ ,
์ฌ๋ฌ ๋์ ์๋ฒ์ ๋ถ์ฐ๋์ด ์งํ๋๋ ์์ ์ ํธ๋์ญ์ ์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๊ธฐ๋ ํฉ๋๋ค.
DB๊ฐ ํ๋๋ผ๋ฉด ํธ๋์ญ์
๋งค๋์ ๋ํ ํ๋๋ง ๋ฑ๋ก๋์ด์ผ ํ๊ณ ,
์ฌ๋ฌ๊ฐ๋ผ๋ JTA๋ฅผ ์ด์ฉํ ๊ธ๋ก๋ฒ ํธ๋์ญ์
์ ์ ์ฉํ ๊ฒ์ด๋ผ๋ฉด JtaTransactionManager ํ๋๋ง ๋ฑ๋ก๋์ด์ผ ํฉ๋๋ค.
๋ ๋ฆฝ๋ ๋ ๊ฐ ์ด์์ DB๋ผ๋ฉด DataSource๋ ๋ ๊ฐ๊ฐ ๋ฑ๋ก๋๋ฏ๋ก,
DB ์์ ๋ฐ๋ฅธ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค.
ํ ๊ฐ์ ์๋ธ ๋๋ฉ์ธ์์ ๊ฐ๊ธฐ ๋ค๋ฅธ MySQL, Oracle ๋ ๊ฐ์ง DB์ ์ ๊ทผ์ด ํ์ํ ๊ฒฝ์ฐ
์ด์ค Datasource๋ฅผ ์ฌ์ฉํ๋ฉด์ ํธ๋์ญ์ ๋งค๋์ ๋ํ ๋ ๊ฐ๋ฅผ ๋ฑ๋กํ๊ฒ ๋ฉ๋๋ค.
๐ @Transactional
Spring์์๋ ํธ๋์ญ์ ์ด ์ ์ฉ๋ ํ๊น ์ธํฐํ์ด์ค๋ ํด๋์ค, ๋ฉ์๋ ๋ฑ์ @Transactional ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌํ์ฌ,
ํธ๋์ญ์ ๋์์ผ๋ก ์ง์ ํ๊ณ ํธ๋์ญ์ ์ ์์ฑ์ ์ ๊ณตํฉ๋๋ค.
์ฆ, ํธ๋์ญ์ ์ ์ ์ฉํ๊ณ ์ ํ๋ ๊ณณ์ @Transactional ์ ๋ถ์ด๋ฉด ์ ์ฉ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
@Transactional์ ์ ์๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
@Target(value={TYPE,METHOD})
@Retention(value=RUNTIME)
@Inherited
@Documented
public @interface Transactional {}
Transactional Annotation์ Target์ด TYPE๊ณผ METHOD ์ ๋๋ค.
์ฆ, Class, interface, enum (TYPE) ์ด๋, Method (METHOD) ์ ์ ์ฉํ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
๋ ๊ฐ์ Target์ ๋์์ ๋ถ์ผ ์๋ ์๋๋ฐ์, ๊ทธ ๋์๋ ๋ฉ์๋์ ๋ถ์ ์ ๋ ธํ ์ด์ ์ด ์ฐ์ ์๋์ด ์ ์ฉ๋ฉ๋๋ค.
์๋์ ์์๋ฅผ ๋ณด๋ฉด, readMember์๋ readOnly ์์ฑ์ default๊ฐ์ธ false๊ฐ ๋ฌด์๋๊ณ
๋ฉ์๋ ๋ฒ์์ ์ค์ ์ด ์ฐ์ ์ ๋์ด readOnly๊ฐ true๋ก ์ ์ฉ๋ฉ๋๋ค.
@Transactional
public interface MemberAnnotService {
@Transactional(readOnly=true)
void readMember(long memberId);
void addMember(List<Member> members);
}
๐ Transaction Properties
์ ์ธ์ ํธ๋์ญ์ ์ 6๊ฐ์ง์ ์์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ
์์ฑ์ ์ ๋นํ ํ์ฉํ์ฌ ๋ก์ง์ ํ์์ ์ํด ์ ์ ํ ์กฐ์ ํ ์ ์์ด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ์ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ ๋๋
Propagation, Isolation, Timeout, ReadOnly ์ ๋ค ๊ฐ์ง ํธ๋์ญ์ ์์ฑ์ผ๋ก ํธ๋์ญ์ ๋ง๋ค ์ง์ ํ ์ ์์ผ๋ฉฐ
์ ์ธ์ ํธ๋์ญ์ ์์๋ ๋กค๋ฐฑ๊ณผ ์ปค๋ฐ์ ๊ธฐ์ค์ ๋ณ๊ฒฝํ๊ธฐ ์ํด
RollbackFor, noRollbackFor ์ด๋ผ๋ ๋ ๊ฐ์ง ์ถ๊ฐ ์์ฑ์ ์ง์ ํ ์ ์์ต๋๋ค.
โ๏ธ Propagation
: ํธ๋์ญ์ ์ ํ
ํธ๋์ญ์ ์ ์์ํ๊ณ , ํน์ ํธ๋์ญ์ ์ ์ํํ๋ค๊ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ง์ฃผํ๋ฉด ์ด๋ป๊ฒ ํ ๊น์?
๊ทธ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ํ ์ค์ ์ ๋๋ค.
์ฆ, ํธ๋์ญ์ ์ ์์ํ๊ฑฐ๋ ๊ธฐ์กด ํธ๋์ญ์ ์ ์ฐธ์ฌํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ์์ฑ์ ๋๋ค.
์ ์ธ์ ํธ๋์ญ์ ๋ฐฉ์์ ์ฅ์ ์, ์ฌ๋ฌ ํธ๋์ญ์ ์ ์ฉ ๋ฒ์๋ฅผ ๋ฌถ์ด์ ์ปค๋ค๋ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ง์ ํ ์ ์๋ ์์ฑ์ ์๋์ ๊ฐ์ต๋๋ค.
โ REQUIRED
: Default. ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ฐธ์ฌํ๊ณ , ์์ผ๋ฉด ์๋ก ์์ฑํด ์์ํฉ๋๋ค.
๋๊ฐ ์ด ์์ฑ์ด๋ฉด ์ถฉ๋ถํ๋ฉฐ, ์์ฐ์ค๋ฝ๊ณ ๊ฐ๋จํ ํธ๋์ญ์ ์ ํ ๋ฐฉ์์ด์ง๋ง ์ฌ์ฉํด๋ณด๋ฉด ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํฉ๋๋ค.
ํ๋์ ํธ๋์ญ์ ์ด ์์๋ ํ ๋ค๋ฅธ ํธ๋์ญ์ ๊ฒฝ๊ณ๊ฐ ์ค์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๊ฐ์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ ๋๋ค.
โ SUPPORT
: ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ฐธ์ฌํ๊ณ , ์์ผ๋ฉด ํธ๋์ญ์ ์์ด ์งํํฉ๋๋ค.
โ MANDATORY
: ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ฐธ์ฌํ๊ณ , ์์ผ๋ฉด ์์ธ๋ฅผ ๋ฐ์ ์ํต๋๋ค.
โ REQUIRES_NEW
: ํญ์ ์๋ก์ด ํธ๋์ญ์ ์ ์์ํ๊ณ , ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ๋ณด๋ฅํ๊ณ ์์ฑํฉ๋๋ค.
โ NOT_SUPPORTED
: ํธ๋์ญ์ ์ ์ ํ ์ฌ์ฉํ์ง ์๊ณ , ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ๋ณด๋ฅํฉ๋๋ค.
โ NEVER
: ํธ๋์ญ์ ์ ๊ฐ์ ๋ก ์ฌ์ฉํ์ง ์๊ณ , ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์์ธ๋ฅผ ๋ฐ์ํฉ๋๋ค.
ํธ๋์ญ์ ์ ์ง์ํ์ง ์๋ ์ค์ ์ ๋๋ค.
NOT_SUPPORTED์ ๋น์ทํ์ง๋ง, ์์ธ๋ฅผ ๋ฐ์์ํค๋ ์ ์ด ๋ค๋ฆ ๋๋ค.
โ NESTED
: ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ค์ฒฉ ํธ๋์ญ์ ์ ์์ํ๊ณ , ๋ถ๋ชจ ํธ๋์ญ์ ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
์ค์ฒฉ ํธ๋์ญ์ ์ด๋ผ ํธ๋์ญ์ ์์ ํธ๋์ญ์ ์ ๋ง๋ญ๋๋ค.
๋จผ์ ์์๋ ๋ถ๋ชจ ํธ๋์ญ์ ์ ์ปค๋ฐ๊ณผ ๋กค๋ฐฑ์๋ ์ํฅ์ ๋ฐ์ง๋ง ์์ ์ ์ปค๋ฐ๊ณผ ๋กค๋ฐฑ์ ๋ถ๋ชจ ํธ๋์ญ์ ์ ์ํฅ์ ์ฃผ์ง ์์ฃ .
์๋ฅผ ๋ค์ด ๋ก๊ทธ ํ์ผ์ ์ ์ฅํ๋ ๋ก์ง์ ๋ฉ์ธ ๋ก์ง์ ์ค์ฒฉ ํธ๋์ญ์ ์ผ๋ก ์งํ ๋ ์ ์๋๋ฐ,
๋ก๊ทธ ์ ์ฅ ๋ก์ง์ ๋ฌธ์ ๊ฐ ์์ด๋ ๋ฉ์ธ ๋ก์ง์ ์คํ์ด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ํฅ์ ์ฃผ๋ฉด ์๋์ง๋ง
๋ฉ์ธ ๋ก์ง์ ๋ฌธ์ ๊ฐ ์์ด์ ๋กค๋ฐฑ์ ํ๋ฉด ๋ก๊ทธ ์ ์ฅ ๋ก์ง์๋ ์ํฅ์ ์ค ์ ์์ด์ผ ํฉ๋๋ค.
// AOP - Advice ๋ฑ๋ก
DefaultTransactionAttribute defaultAttribute = new DefaultTransactionAttribute();
defaultAttribute.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// @Transactional
@Transactional(propagation = Propagation.PROPAGATION_REQUIRED)
โ๏ธ Isolation
: ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋์์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์งํ๋ ๋,
ํธ๋์ญ์ ์ ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์๊ฒ ์ด๋ป๊ฒ ๋ ธ์ถํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ ๋๋ค.
์๋ฅผ ๋ค์ด Transaction A๊ฐ ์ฝ๊ธฐ ์์ ์ ํ ๋, Transaction B ๊ฐ ์ ๊ทผํ ์ ์๋๋,
ํน์ Transaction A๊ฐ Commit ์ ์ผ ๋ Transaction B๊ฐ ์ ๊ทผํ ์ ์๋๋ ๋ฅผ ์ค์ ํฉ๋๋ค.
โ DEFAULT
: ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ๋๋ DB์ ๋ํดํธ ์ค์ ์ ๋ฐ๋ฆ ๋๋ค.
๋๋ถ๋ถ์ DB๋ READ_COMMITTED๋ฅผ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ๊ฐ์ง๋ง,
๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ด๋ DB๋ง๋ค ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ DB๋ ๋๋ผ์ด๋ฒ ๋ฌธ์๋ฅผ ์ดํด๋ณผ ํ์๊ฐ ์์ต๋๋ค.
โ READ_UNCOMMITTED (level 0)
: ์ปค๋ฐ๋์ง ์๋ ๋ฐ์ดํฐ์ ๋ํ ์ฝ๊ธฐ ํ์ฉ
- Dirty Read๊ฐ ๋ฐ์ ๊ฐ๋ฅ
๊ฐ์ฅ ๋ฎ์ ๊ฒฉ๋ฆฌ ์์ค์
๋๋ค. ํ๋์ ํธ๋์ญ์
์ด ์ปค๋ฐ๋๊ธฐ ์ ์ ๊ทธ ๋ณํ๊ฐ ๋ค๋ฅธ ํธ๋์ญ์
์ ๊ทธ๋๋ก ๋
ธ์ถ๋๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํ์ง๋ง ๊ฐ์ฅ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ์กฐ๊ธ ๋จ์ด์ง๋๋ผ๋ ์ฑ๋ฅ์ ๊ทน๋ํํ ๋ ์๋์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
โ READ_COMMITTED (level 1)
: ์ปค๋ฐ๋ ๋ฐ์ดํฐ์ ๋ํ ์ฝ๊ธฐ ํ์ฉ
-Dirty Read ๋ฐฉ์ง
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก, ์ปค๋ฐ๋์ง ์์ ์ ๋ณด๋ ์ฝ์ ์ ์์ต๋๋ค.
๋์ ํ๋์ ํธ๋์ญ์ ์ด ์ฝ์ ๋ก์ฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์, ํธ๋์ญ์ ์ด ๊ฐ์ ๋ก์ฐ๋ฅผ ๋ค์ ์ฝ์์ ๋ ๋ค๋ฅธ ๋ด์ฉ์ผ ์ ์์ต๋๋ค.
โ REPEATABLE_READ (level 2)
: ๋์ผ ํ๋์ ๋ํด ๋ค์ค ์ ๊ทผ ์ ๋ชจ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅ
- Non-Repeatable Read ๋ฐฉ์ง
ํ๋์ ํธ๋์ญ์
์ด ์ฝ์ ๋ก์ฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์
์ด ์์ ํ๋ ๊ฒ์ ๋ง์ง๋ง, ์๋ก์ด ๋ก์ฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ํํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ SELECT๋ก ์กฐ๊ฑด์ ๋ง๋ ๋ก์ฐ๋ฅผ ์ ๋ถ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ, ํธ๋์ญ์ ์ด ๋๋๊ธฐ ์ ์ ์๋ก ์ถ๊ฐ๋ ๋ก์ฐ๊ฐ ๋ฐ๊ฒฌ๋ ์ ์์ต๋๋ค.
โ SERIALIZABLE (level 3)
: ์ฝ๊ธฐ ์์ ์๋ ๊ณต์ ์ ๊ธ์ ์ค์ ํ๊ฒ ๋๊ณ , ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ์ง ๋ชปํจ
ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ shared lock์ด ๊ฑธ๋ฆฌ๋ฏ๋ก
๋ค๋ฅธ ์ฌ์ฉ์๋ ๊ทธ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ๋ฐ ์ ๋ ฅ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ์ฅ ์์ ํ ๊ฒฉ๋ฆฌ์์ค์ด์ง๋ง ๊ฐ์ฅ ์ฑ๋ฅ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ทน๋จ์ ์ผ๋ก ์์ ํ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์์ฃผ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
// AOP - Advice ๋ฑ๋ก
DefaultTransactionAttribute defaultAttribute = new DefaultTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED);
defaultAttribute.setIsolationLevel(1);
// @Transactional
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
โ๏ธ Timeout
: ํธ๋์ญ์ ์ ํ์๊ฐ
์ด ๋จ์๋ก ์ ํ ์๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
๋ํดํธ๋ ์์คํ ์ ์ ํ ์๊ฐ์ ๋ฐ๋ฅด๋ ๊ฒ์ ๋๋ค.
์ง์ ์ง์ ํ๋ ๊ฒฝ์ฐ ์ด ๊ธฐ๋ฅ์ ์ง์ํ์ง ๋ชปํ๋ ์ผ๋ถ ํธ๋์ญ์ ๋งค๋์ ๋ ์์ธ๋ฅผ ๋ฐ์ํ ์ ์์ต๋๋ค.
โ๏ธ ReadOnly
: ํธ๋์ญ์ ์ฝ๊ธฐ ์ ์ฉ
ํธ๋์ญ์ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ฌ์ฉํ ์๋ ์๊ณ ,
ํน์ ํธ๋์ญ์ ์์ ์์์ ์ฐ๊ธฐ ์์ ์ด ์ผ์ด๋๋ ๊ฒ์ ์๋์ ์ผ๋ก ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ์ผ๋ถ ํธ๋์ญ์ ๋งค๋์ ์ ๊ฒฝ์ฐ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋ฌด์ํ ์๋ ์์ผ๋ ์ฃผ์ํด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก INSERT, UPDATE, DELETE ๊ฐ์ ์ฐ๊ธฐ ์์ ์ด ์งํ๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฑ๋ฅ์ ์ํด queryservice ํ์์ ๋ฉ์๋์์ ์ฃผ๋ก ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
โ๏ธ RollbackFor
RollbackFor, RollbackForClassName
ํธ๋์ญ์ ๋กค๋ฐฑ ๋์ ์ง์
์ ์ธ์ ํธ๋์ญ์
์์๋ ๋ฐํ์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑํฉ๋๋ค.
์์ธ๊ฐ ๋ฐ์ํ์ง ์๊ฑฐ๋ ์ฒดํฌ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ปค๋ฐํฉ๋๋ค.
์ฒดํฌ ์์ธ๋ฅผ ์ปค๋ฐ ๋์์ผ๋ก ์ผ๋ ์ด์ ๋ ์ฒดํฌ์์ธ๊ฐ ์์ธ์ ์ธ ์ํฉ์์ ์ฌ์ฉ๋๊ธฐ ๋ณด๋ค๋,
๋ฆฌํด๊ฐ์ ๋์ ํด์ ๋น์ฆ๋์ค ์ ์ธ ์๋ฏธ๋ฅผ ๋ด์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๋ ์ฉ๋๋ก ๋ง์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์คํ๋ง์์๋ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ ์์ธ๋ ๋ฐํ์ ์์ธ(์ธ์ฒดํฌ ์์ธ)๋ก ์ ํ๋์ด์
๋์ ธ์ง๋ฏ๋ก ๋ฐํ์ ์์ธ๋ง ๋กค๋ฐฑ ๋์์ผ๋ก ์ผ์ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ์ํ๋ค๋ฉด ๊ธฐ๋ณธ ๋์๋ฐฉ์์ ๋ฐ๊ฟ ์ ์๋๋ฐ์.
๋ฐ๋ก ์ด RollbackFor, RollbackForClassName์์ฑ์ ์ด์ฉํด์ ์ค์ ํ ์ ์์ต๋๋ค.
์ฒดํฌ ์์ธ์ง๋ง ๋กค๋ฐฑ ๋์์ผ๋ก ์ผ์ํ ํ๋ ๊ฒ์ด ์๋ค๋ฉด ์ด ์์ฑ์ Rollback์ ์ ์ฉํ ์์ธ๋ฅผ ์ค์ ํฉ๋๋ค.
// AOP - Advice ๋ฑ๋ก
List<RollbackRuleAttribute> rollbackRules = new ArrayList<>();
rollbackRules.add(new RollbackRuleAttribute(Exception.class));
RuleBasedTransactionAttribute masterAttribute = new RuleBasedTransactionAttribute();
masterAttribute.setRollbackRules(rollbackRules);
// @Transactional
@Transactional(rollbackFor = Exception.class)
โ๏ธ noRollbackFor
noRollbackFor, noRollbackForClassName
ํธ๋์ญ์ ๋กค๋ฐฑ ์์ธ ๋์ ์ง์
์์๋ ๋ฐ๋๋ก, ๊ธฐ๋ณธ์ ์ผ๋ก ๋กค๋ฐฑ ๋์์ธ ๋ฐํ์ ์์ธ๋ฅผ ์ ์ธ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ์์ฑ์ ๋๋ค.
๋กค๋ฐฑ ๋์์ ์์ธ๋ฅผ ์ปค๋ฐ ๋์์ผ๋ก ์ง์ ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด
@Transactional(noRollbackFor = MyCustomException.class)
public void myTransactionalMethod() {
// ์์ธ ๋ฐ์ ๊ฐ๋ฅํ ์ฝ๋
}
์์ ๊ฐ์ด ์ ์ธํ๋ฉด MyCustomException ํด๋์ค์ ๊ทธ ํ์ ํด๋์ค์ ๋ํด์๋
๋กค๋ฐฑ์ ์ํํ์ง ์์ต๋๋ค.
์ถ์ฒ : https://gngsn.tistory.com/152
'BackEnd > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
CircuitBreaker ๋ก ์๋ฐฉํ๋ ์ฅ์ ์ ํ(2) (0) | 2023.12.12 |
---|---|
CircuitBreaker ๋ก ์๋ฐฉํ๋ ์ฅ์ ์ ํ(1) (0) | 2023.12.10 |
[Spring] ์ด๋ ธํ ์ด์ ์ ์ ์์ ๋์์๋ฆฌ (0) | 2023.09.18 |
์คํ๋ง ๋ถํธ ๋ก์ปฌ ์บ์ ์ ์ฉํ๊ธฐ (0) | 2023.06.25 |
Feign Client ๋ฅผ ํ์ฉํ์ฌ ์ธ๋ถํต์ ์ฐ๋ํ๊ธฐ (0) | 2023.04.22 |