Transaction
ํํ java์์ ํธ๋์ญ์
์ฌ์ฉ์ try catch
๋ฌธ ์ฌ์ด์ commit๊ณผ Rollback์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํ๋ค.
Connection conn = null;
try {
conn = DriverManager.getConnection(jdbcUrl, user, pw);
conn.setAutoCommit(false);
/*
...์ฟผ๋ฆฌ ์คํ..
*/
conn.commit();
} catch (SQLException e) {
if(conn!=null) {
try {
conn.rollback();
} catch (SQLException e1) {
}
}
} finally {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
}
}
}
reSpring์์๋ ์ด๋ฌํ ๋ฐ๋ณต์ ์ธ ์์ ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฒ์ ํด๊ฒฐํ ์ ์๋ค.
์ ์ธ์ ์ํ ํธ๋์ญ์
ํ๋ก๊ทธ๋จ์ ์ํ ํธ๋์ญ์
์ ์ธ์ ์ํ ํธ๋์ญ์
์ ์ธ์ ์ํ ํธ๋์ญ์ ์๋ ๋๊ฐ์ง(1. AOP 2. annotation) ๋ฐฉ๋ฒ์ด ์๋ค.
@Transactional Annotation
์ฐ์ annotation ์ฌ์ฉ์ ์ํ bean ์ค์ ์ ํด์ค๋ค.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value=""/>
<property name="user" value="user"/>
<property name="password" value="pwd"/>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<tx:annotation-driven transaction-manager="transactionManager"/>
</bean>
</beans>
๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ํ๋ ๋ฉ์๋ ์์ @Transactional
์ ๋ถ์ฌ ๊ฐํธํ๊ฒ ํธ๋์ญ์
์ ๊ตฌํํ ์ ์๋ค.
๋ฉ์๋ ์ ์ฒด๋ฅผ ํ๋์ ํธ๋์ญ์
์ผ๋ก ๋ฌถ์ ์ ์๋ค๋ ๊ฒ์@Transactional
์ ๋ด๋ถ ๋์์ด Proxy๋ก ์ด๋ฃจ์ด์ง๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
@Transactional
public void something (int a) {
...
}
@Transactional
์ด ์ ์ฉ๋ ๊ฒฝ์ฐ ํธ๋์ญ์
๊ธฐ๋ฅ์ด ์ ์ฉ๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
์ด ํ๋ก์ ๊ฐ์ฒด๋ @Transactional
์ด ํฌํจ๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, PlatformTransactionManager๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์
์ ์์ํ๊ณ , ๊ฒฐ๊ณผ์ ์ ์ ์ฌ๋ถ์ ๋ฐ๋ผ Commit ๋๋ Rollback ํ๋ค.
@Transactional
์ด๋
ธํ
์ด์
์ ์ฌ๋ฌ๊ฐ์ง ์์ฑ์ ์ง์ ํ ์ ์๋ค.
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public int method(int i) throws Exception {
return sqlMapClient.delete("");
}
isolation
๊ฒฉ๋ฆฌ์์ค(ํธ๋์ญ์ ์์ ์ผ๊ด์ฑ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋๋ก ํ๋ ์์ค)์ ๋งํ๋๋ฐ ์ต์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
level
์ต์
์ค๋ช
level 0
READ_UNCOMMITTED
ํธ๋์ญ์ ์ ์ฒ๋ฆฌ์ค์ธ or ์์ง commit(ํ์ )๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋ ๊ฒ์ ํ์ฉํ๋ค. ex) ํ ์ฌ์ฉ์๊ฐ A๋ผ๋ ๋ฐ์ดํฐ๋ฅผ B๋ผ๋ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ ์์ง ์๋ฃ๋์ง์์(Uncommitted or Dirty) ๋ฐ์ดํฐ B'๋ฅผ ์ฝ์ ์ ์๋ค.
level 1
READ_COMMITTED
Dirty Read๋ฅผ ๋ฐฉ์งํ๋ค. ์ฆ, ํธ๋์ญ์ ์ด commit๋์ด ํ์ ๋ ๋ฐ์ดํฐ๋ง์ ์ฝ๋ ๊ฒ์ ํ์ฉํ๋ค. ex) ํ ์ฌ์ฉ์๊ฐ A๋ผ๋ ๋ฐ์ดํฐ๋ฅผ B๋ผ๋ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
level 2
REPEATABLE_READ
ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT๋ฌธ์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ shared lock์ด ๊ฑธ๋ฆฐ๋ค. ๋ค๋ฅธ ์ฌ์ฉ์๋ ๊ทธ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ ํ ํธ๋์ญ์ ์ด ์ฝ์ ๋ฐ์ดํฐ๋ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋ ๋๊น์ง ํํ ํธ๋์ญ์ ์ด ๊ฐฑ์ ํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒ์ ๋ถํํจ์ผ๋ก์จ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์ฟผ๋ฆฌํ์ ๋ ์ผ๊ด์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํจ
level 3
SERIALIZABLE
์๋ฒฝํ ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ค. ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ ๋ฐ ๋์์ฑ์ ์ํด MVCC๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ shared lock์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ๋ค๋ฅธ ์ฌ์ฉ์๋ ๊ทธ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ๋ฐ ์ ๋ ฅ์ด ๋ถ๊ฐ๋ฅํ๋ค.
Dirty read
์์ ๊ฐ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ๋ ์์ ์ด ์๋ฃ๋์ง ์์๋๋ฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๋ ํ์์ dirty read ๋ผ๊ณ ํ๋ฉฐ, READ UNCOMMITTED ๊ฒฉ๋ฆฌ์์ค์์๋ง ์ผ์ด๋๋ ํ์
MVVC(Multi Version Concurrency Control)
MVCC๋ ๋ค์ค ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ํ ๊ธฐ์ ๋ก ๋ฐ์ดํฐ ์กฐํ ์ LOCK์ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ์ดํฐ์ ๋ฒ์ ์ ๊ด๋ฆฌํด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ ๋ฐ ๋์์ฑ์ ๋์ด๋ ๊ธฐ์
propagation
ํธ๋์ญ์ ๋์ ๋์ค์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์คํํด์ผํ๋ ์ํฉ์ด ์์ฃผ ๋ฐ์ํ๊ฒ ๋๋๋ฐ, ํธ์ถ๋๋ ํธ๋์ญ์ ์ ์ ์ฅ์์๋ ํธ์ถํ ํธ๋์ญ์ ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์๋ ์๊ณ , ์๋ก์ด ํธ๋์ญ์ ์ ์์ฑํ ์๋ ์๋ค.
ํธ์ถํ ํธ๋์ญ์ ์ ๊ทธ๋๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ชจ๋ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ์ด ๋๋ค.
์๋ก์ด ํธ๋์ญ์ ์ ์์ฑํ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ ๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ํธ๋์ญ์ ๊ด๋ จ ์ค์ ์ @Transactional์ propagation ์์ฑ์ ํตํด ์ง์ ํ ์ ์๋ค.
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void something (int a) {
โฆ
}
propagation ์์ฑ
์ค๋ช
REQUIRED
๋ถ๋ชจ ํธ๋์ญ์ ๋ด์์ ์คํํ๋ฉฐ ๋ถ๋ชจ ํธ๋์ญ์ ์ด ์์ ๊ฒฝ์ฐ ์๋ก์ด ํธ๋์ญ์ ์ ์์ฑ
REQUIRES_NEW
๋ถ๋ชจ ํธ๋์ญ์ ์ ๋ฌด์ํ๊ณ ๋ฌด์กฐ๊ฑด ์๋ก์ด ํธ๋์ญ์ ์ด ์์ฑ
MANDATORY
๋ถ๋ชจ ํธ๋์ญ์ ๋ด์์ ์คํ๋๋ฉฐ ๋ถ๋ชจ ํธ๋์ญ์ ์ด ์์ ๊ฒฝ์ฐ ์์ธ๊ฐ ๋ฐ์
SUPPORTS
๋ถ๋ชจ ํธ๋์ญ์ ๋ด์์ ์คํํ๋ฉฐ ๋ถ๋ชจ ํธ๋์ญ์ ์ด ์์ ๊ฒฝ์ฐ nontransactionally๋ก ์คํ
NOT_SUPPORTED
nontransactionally๋ก ์คํํ๋ฉฐ ๋ถ๋ชจ ํธ๋์ญ์ ๋ด์์ ์คํ๋ ๊ฒฝ์ฐ ์ผ์ ์ ์ง
NEVER
nontransactionally๋ก ์คํ๋๋ฉฐ ๋ถ๋ชจ ํธ๋์ญ์ ์ด ์กด์ฌํ๋ค๋ฉด ์์ธ๊ฐ ๋ฐ์
NESTED
ํด๋น ๋ฉ์๋๊ฐ ๋ถ๋ชจ ํธ๋์ญ์ ์์ ์งํ๋ ๊ฒฝ์ฐ ๋ณ๊ฐ๋ก ์ปค๋ฐ๋๊ฑฐ๋ ๋กค๋ฐฑ๋ ์ ์๋ค. ๋๋ฌ์ผ ํธ๋์ญ์ ์ด ์์ ๊ฒฝ์ฐ REQUIRED์ ๋์ผํ๊ฒ ์๋
rollback-for
ํน์ ์์ธ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ์ ๋กค๋ฐฑ๋๋๋ก ์ค์ ํ๋ค. ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ ์ค๋ก์ง RuntimeException์ ์์๋ฐ์ ์์ธ์๋ง ๋กค๋ฐฑ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
no-rollback-for
ํน์ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋กค๋ฐฑ๋์ง ์๋๋ก ์ค์ ํ๋ค.
์ฐธ์กฐ
Last updated
Was this helpful?