반응형
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
Connection con = dataSource.getConnection();
try {
con.setAutoCommit(false);
// 비즈니스 로직 수행
Member fromMember = memberRepository.findById(con, fromId);
Member toMember = memberRepository.findById(con, toId);
memberRepository.update(con, fromId, fromMember.getMoney() - money);
validation(toMember);
memberRepository.update(con, toId, toMember.getMoney() + money);
con.commit();
} catch (Exception e) {
con.rollback();
throw new IllegalStateException(e);
} finally {
if (con != null) {
try {
con.setAutoCommit(true); // 커넥션을 풀에 다시 반환하기 전에 autocommit default 값 true로 세팅하기
con.close();
} catch (Exception e) {
log.info("error", e);
}
}
}
}
커넥션 트랜잭션 시작시 만약 autocommit를 false로 세팅했을시 위 코드와 같이 커넥션 풀에 커넥션을 반환시 기본 autocommit인 true로 세팅해주고 반환해야한다.
DriverManager처럼 데이터풀을 안사용하는 커넥션 라이브러리면 상관은 없지만 현재는 hikari풀을 많이 사용한다.
반응형