트랜잭션 (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;
}
'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 |