본문 바로가기

JSP

[JSP] 트랜잭션 commit(), rollback()

728x90
반응형

트랜잭션 (Transaction) 

트랜잭션(Transaction)은 여러 단계의 작업을 하나로 처리하는 것으로, 

하나로 인식된 작업이 모두 성공적으로 끝나면 commit이 되고, 

하나라도 문제가 발생하면 rollback 되어서 작업을 수행하기 전단계로 모든 과정이 회수 됨 

ex) 회원탈퇴 -> 게시글이 전부삭제되었니? 
     댓글추가 -< 게시글의 댓글수 +1 

 

* 트랜잭션을 위한 메소드 : commit(), rollback()

- commit() : 하나의 트랜잭션 단위가 잘 처리되었으니, 이 변경사항을 마무리해라. [확인] 

- rollback() : 트랜잭션 처리과정중에 문제가 발생했으니, 이전에 처리했던 기능을 다시 되돌려놓아라. 

 

기본적으로 Connection 객체에 setAutoCommit(boolean autoCommit) 이란 메소드가 있는데

기본값이 true 로 설정이 되어 있어서 기본적으로 JSP 는 오토커밋(Autocommit)이다. commit 이 자동으로 수행

 

그러나 트랜잭션(Transaction)을 처리할 때는 오토커밋이 일어나서 자동으로 commit을 사용하면 안 되기때문에

여러 개의 쿼리 문장이 하나의 작업으로 수행되어야 하기 때문에 JSP의 오토커밋이 자동으로 작동되지 못하게 해야 함. 

=> 오토커밋이 자동으로 작동되지 못하게 하려면 setAutoCommit(false); 지정!! 

 

예시 : 은행 계좌 이체 

-> bank1이 bank2에게 입금을 한다면, bank1의 잔액에서 차감된 만큼 bank2의 잔액에 추가

public class Bank1DAO {
	Connection conn;
	PreparedStatement pstmt;
	
	final String sql_transfer1="UPDATE BANK1 SET BALANCE=BALANCE-? WHERE BID=101";
	final String sql_transfer2="UPDATE BANK2 SET BALANCE=BALANCE+? WHERE BID=222";
	public boolean transfer(int balance) {
		// DAO의 메서드는 일반적으로 vo
		// 강제적으로 자료형,인자의 개수를 고정할수도있음!
		conn=JDBCUtil.connect();
		try {
			conn.setAutoCommit(false);
			// 트랜잭션의 시작을 설정하는 메서드
			// 자동commit을 해제할수있음(MySQL)
			
			// +++하나의 작업단위+++
			pstmt=conn.prepareStatement(sql_transfer1);
			pstmt.setInt(1, balance);
			pstmt.executeUpdate();
			
			pstmt=conn.prepareStatement(sql_transfer2);
			pstmt.setInt(1, balance);
			pstmt.executeUpdate();
			// +++하나의 작업단위+++
			
			System.out.println("얍!");
			pstmt=conn.prepareStatement(sql_selectOne);
			ResultSet rs=pstmt.executeQuery();
			rs.next();
			System.out.println(rs.getString("BNAME")+" | "+rs.getInt("BALANCE"));
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			rs.close();
			
			pstmt=conn.prepareStatement(sql_selectOne);
			rs=pstmt.executeQuery();
			rs.next();
			if(rs.getInt("BALANCE")<0) { // 가진금액보다 더많이 계좌이체를 하려고할때
				conn.rollback();
				return false;
			}
			else {
				conn.commit();
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
728x90
반응형

'JSP' 카테고리의 다른 글

[JSP] 초기화 매개변수, 리스너, 필터  (0) 2022.08.25
[JSP] FrontController 개념  (0) 2022.08.24
[JSP] 리스너 클래스, JSTL  (0) 2022.08.18
[JSP] 커스텀태그 사용법  (0) 2022.08.14
[JSP] 표현언어 EL (Expression Language)  (0) 2022.08.14