DAO의 각 메서드는 개별 Connection을 사용한다.
때문에 같은 Tx내에서 같은 Connection을 사용할 수 있게 관리한다.
DAO에서 Connection을 얻거나 반환할 때 DataSourceUtils를 사용해야한다.
public void insertWithTx() throws Exception {
//before advice - 부가 기능
PlatformTransactionManager tm = new DataSourceTransactionManager(ds);
TransactionStatus status = tm.getTransaction(new DefaultTransactionDefinition());
//Tx 시작
try {
//핵심 기능
a1Dao.insert(1, 100);
a1Dao.insert(1, 200);
//after advice - 부가 기능
tm.commit(status); //Tx 끝 - 성공이면 커밋
} catch(Exception ex) {
tm.rollback(status); //Tx 끝 - 실패하면 롤백
}
}
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven/>
@Transactional
public void insertWithTx() throws Exception {
//핵심 기능
a1Dao.insert(1, 100);
a1Dao.insert(1, 200);
}
propagation - Tx의 경계를 설정.
isolation - Tx의 isolation level을 지정.
readOnly - Tx이 데이터를 읽기만 하는 경우. true로하면 성능 향상.
rollBackFor - Exception예외 발생 시 사용.
noRollBackFor - 지정된 예외가 발생해도, Tx를 rollback하지 않음.
timeout - 지정된 시간 내에 Tx가 종료되지 않으면 강제 종료.
REQUIRED - Tx이 진행중이면 참여하고, 없으면 새로운 Tx시작(default)
REQUIRES_NEW - Tx이 진행중이건 아니건, 새로 Tx 시작(Tx안에 다른 Tx 생성)
NESTED - Tx이 진행 중이면, Tx의 내부 Tx로 실행(Tx안에 subTx(save point)로 같은 Tx 생성)