public void insertWithTx() throws Exception {
// TxManager 생성
PlatformTransactionManager tm = new DataSourceTransactionManager(ds);
TransactionStatus status = tm.getTransaction(new DefaultTransactionDefinition());
// Tx 시작
try {
dao.insert(1,100); // 원래는 개별 Connection
dao.insert(1,200); // TxManager 가 같은 Connection 으로 묶어준다.
tm.commit(status); // Tx 끝 - 성공 (커밋)
} catch(Exception ex) {
tm.rollback(status); // Tx 끝 - 실패 (롤백)
}
}
dao.insert(1,100);
@Transactional
public void insertWithTx() throws Exception {
dao.insert(1,100);
dao.insert(1,200);
}
@Transactional(rollbackFor = Exception.class)
✅속성 | 설명 |
---|---|
propagation | Tx 의 경계 (boundary) 를 설정하는 방법을 지정 |
isolation | Tx 의 isolation level 을 지정 DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE |
readOnly | Tx 이 데이터를 읽기만 하는 경우 true 로 지정하면 성능이 향상 |
rollbackFor | 지정된 예외가 발생하면 Tx 을 rollback |
RuntimeException 과 Error 는 자동 rollback | |
noRollbackFor | 지정된 예외가 발생해도 Tx 을 rollback 하지 않는다. |
timeout | 지정된 시간 (초) 내에 Tx 이 종료되지 않으면 Tx 을 강제 종료 |
값 | 설명 |
---|---|
REQUIRED | Tx 이 진행 중이면 참여하고 없으면 새로운 Tx 시작 (디폴트) |
REQUIRES_NEW | Tx 이 진행 중이건 아니건 새로 Tx 시작 |
NESTED | Tx 이 진행 중이면, Tx 의 내부 Tx 로 실행 |
MANDATORY | 반드시 진행 중인 Tx 내에서만 실행 가능 아니면 예외 발생 |
SUPPORTS | Tx 이 진행 중이건 아니건 상관 없이 실행 |
NOT_SUPPORTED | Tx 없이 처리 Tx 이 진행 중이면 잠시 중단 (suspend) |
NEVER | Tx 없이 처리 Tx 이 진행 중 이면 예외 발생 |
@Transactional(propagation = Propagation.REQUIRED)
public void insertA1WithTx() throws Exception {
a1Dao.insert(1,100);
insertB1WithTx();
a1Dao.insert(1,200);
}
@Transactional(propagation = Propagation.REQUIRED)
public void insertB1WithTx() throws Exception {
b1Dao.insert(1,100);
b1Dao.insert(1,200);
}
@Transactional(propagation = Propagation.REQUIRED)
public void insertA1WithTx() throws Exception {
a1Dao.insert(1,100);
insertB1WithTx();
a1Dao.insert(1,200);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertB1WithTx() throws Exception {
b1Dao.insert(1,100);
b1Dao.insert(1,200);
}
프록시 방식 (디폴트) 의 AOP 는 내부 호출인 경우 Advice 가 적용 되지 않기 때문에 따로 Tx 가 적용되지 않는다.
두 메서드를 별도의 클래스로 분리 하거나 AOP 를 프록시 방식이 아닌 다른 방식으로 처리해야 예제처럼 Tx 적용