자바(Java)/JAVA 2EE

프로그램으로 트랜잭션 처리하는 방법

본클라쓰 2009. 12. 26. 07:04

 

 JDBC를 사용하여 트렌젝션을 처리할 때는 커밋을 설정하여 트렌젝션을 처리한다.

 

 컨넥션 객체의 커밋 기본 설정은 true 이다. 즉, 쿼리를 데이터 베이스에 질의한 후 자동으로 commit 을 발생시킨다. 트렌젝션을 처리하기 위해서는 커밋 설정을 false 로 변경한 후 모든 쿼리가 끝나면 커밋을 발생시킨다. 하지만 오류나 예외가 발생할 때는 롤백(rollback) 을 시켜처리한다. 모든 과정이 끝났다면 컨넥션 객체의 기본 커밋 설정을 true로 돌려놓은 순으로 트렌젝션을 처리한다.

 

■ 트렌젝션을 처리하는 기본 코드

Connection conn = getConnection();

conn.setAutoCommit(false);

 

try {

    쿼리 수행 시작

    쿼리 수행 끝

    conn.commit(); 

} catch (Exception e) {

    conn.rollback();

} finally {

   conn.setAutoCommit(true); 

  

 위의 경우는 컨넥션과 쿼리문이 하나의 객체의 메소드에 포함되어 있을 경우이다. 하지만 쿼리문을 수행하는 객체와 컨넥션을 얻는 객체가 다를 경우에는 컨넥션 객체를 매개변수로 쿼리문을 수행하는 객체에 전달해야 한다. 이 경우 트렌젝션의 처리는 다음과 같다.

 

■ 쿼리문을 수행하는 객체

public boolean insert(Connection conn, EmployeeBasicVo vo) {

    PreparedStatement pst = null;
  
    try {
        pst = conn.prepareStatement(INSERT);
        pst.setString(1, vo.getEmployeeCode());
        pst.setString(2, vo.getEmployeeName());
        pst.setString(3, vo.getPassword());
        pst.setString(4, vo.getSocialFirst());
        pst.setString(5, vo.getSocialSecond());
        pst.setString(6, vo.getAccessLevel());
        pst.setString(7, vo.getPostFirst());
        pst.setString(8, vo.getPostSecond());
        pst.setString(9, vo.getAddress());
        pst.setString(10, vo.getEmail());
        pst.setString(11, vo.getCellularFirst());
        pst.setString(12, vo.getCellularSecond());
        pst.setString(13, vo.getCellularThird());
        pst.executeUpdate();
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        if ( pst != null ) try { pst.close(); } catch(SQLException e){}
    }
    return true;
}

 

 

■ 컨넥션을 얻어 트렌젝션을 처리하는 객체의 메소드

public boolean insert(EmployeeBasicVo basicVo, EmployeeAddInfoVo addInfoVo) {

    Connection conn = null;
  
    try {
        conn = getConnection();
        conn.setAutoCommit(false);
   
        try {
            boolean isTransaction = basicDao.insert(conn, basicVo) && addInfoDao.insert(conn, addInfoVo);


            if ( !isTransaction ) {
             conn.rollback();
                return false;
             }
     
          conn.commit();
    
        } catch (Exception e) {
            e.printStackTrace();
          conn.rollback();
        } finally {
          conn.setAutoCommit(true);

       }
   
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        if ( conn != null ) release(conn);
    }
    return true;
}