본문 바로가기

IT/스프링

스프링 autocommit

반응형
    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풀을 많이 사용한다. 

반응형

'IT > 스프링' 카테고리의 다른 글

계층 정의  (0) 2023.01.18