스프링이 제공하는 트랜잭션 매니저를 코드에 직접 적용해보자.
DataSourceUtils
DataSourceUtils.getConnection(dataSource);
DataSourceUtils.releaseConnection(con, dataSource);
사용 예제
@Slf4j
@RequiredArgsConstructor
public class MemberService {
private final PlatformTransactionManager txManager;
private final MemberRepository memberRepository;
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
//트랜잭션 시작
TransactionStatus status = txManager.getTransaction(new DefaultTransactionDefinition());
try {
//비즈니스 로직
txManager.commit(status); //성공시 커밋
} catch (Exception e) {
txManager.rollback(status); //실패시 롤백
throw new IllegalStateException(e);
}
}
}
private final PlatformTransactionManager txManager
TransactionStatus status = txManager.getTransaction(new DefaultTransactionDefinition())
new DefaultTransactionDefinition()
txManager.commit(status)
, txManager.rollback(status)
transactionManager.getTransaction()
을 호출한다.DataSourceUtils.getConnection(dataSource)
를 호출해 트랜잭션 동기화 매니저로부터 동기화된 커넥션을 가져온다.DataSourceUtils.releaseConnection(con, dataSource)
을 호출해 커넥션 객체를 트랜잭션 동기화 매니저에 반납한다.(9) 커밋 또는 롤백 메소드를 호출한다.
(10) 트랜잭션 매니저는 트랜잭션 동기화 매니저로부터 커넥션을 가져온다.
(11) 커밋 또는 롤백을 수행한다.
(12) 리소스를 정리한다.
con.close()
하여 커넥션 객체를 종료하거나 커넥션 풀에 반납한다.정리