트랜잭션이란 db에 접근하여 수행하는 작업의 처리단위이다.
ex) 게임 과금 시스템
1. 게임아이템을 사기위해 과금을 해서 게임머니를 충전한다.
2. 게임아이템을 사기위해 게임머니가 줄어들고 게임 아이템을 획득한다.
만약 1번 과정과 2번 과정을 분리되어있다고 가정해보자.
1번과정을 수행하고 2번과정 중에 문제가 일어나게 된다면 게임아이템은 획득하지 못하게 된다.
또한 별도의 처리가 없으면 과금을 했던 돈 또한 돌아오지 않는다.
이러한 문제를 해결하기 위해 1-2의 과정을 하나의 과정으로 처리해 주어 어느 부분에서 문제가 일어나더라도 하나의 과정안에서 수행취소가 진행되도록 코딩해 주어야한다.
[사용법]
-conn.setAutoCommit(false)
: 기본적으로, 모든 작업 하나하나를 하나의 단위로 취급(prepareStatement기준으로)
: 인자를 false로 준다면 오토커밋이 해제된다
-conn.setAutoCommit(true);
: 트랜잭션내의 수행이 끝났다면 원래대로 돌려주는 것이 좋다.
-commit(): 수행허가
-rollback(): 수행취소
public boolean update2(MemberVO vo) {
conn=JDBCUtil.connect();
try {
conn.setAutoCommit(false);
pstmt=conn.prepareStatement(update2);
pstmt.setInt(1, vo.getPoint());
pstmt.setInt(2, vo.getId());
int res=pstmt.executeUpdate();
if(res==0) {
System.out.println("로그: DAO: 포인트사용대상없음!");
return false;
}
pstmt=conn.prepareStatement(check);
pstmt.setInt(1, vo.getId());
ResultSet rs=pstmt.executeQuery();
rs.next();//무조건 대상이 있기때문에 if쓰지않아도됨
if(rs.getInt(1) < 0) {
conn.rollback(); // 수행을 취소해라
//수행은 pstmt=conn.prepareStatement(update2);을 취소해야함
System.out.println("로그: update2(): 결제취소");
return false;
}
else {
conn.commit(); // 허가한다!
System.out.println("로그: update2(): 결제승인완료");
}
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} finally {
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JDBCUtil.disconnect(pstmt, conn);
}
return true;
}
'JAVA' 카테고리의 다른 글
day22) Java를 이용한 웹 크롤링 2 - 크롤링한 값 db에 저장하기 (0) | 2022.01.25 |
---|---|
day21) Java를 이용한 웹 크롤링1 - 기본 개념 (0) | 2022.01.25 |
day19) JDBC를 이용한 DB연동2 - CRUD구현 (0) | 2022.01.22 |
day18) JDBC를 이용한 DB, Eclipse 연동 (0) | 2022.01.20 |
day17) [용어 정리 ] 컴포넌트, DBMS, JDBC (0) | 2022.01.19 |
댓글