수많은 일들을 하다보면 DB에 접근하여 연속성 있게 insert, delete, update 등을 수행해야 할 일들이 있다.
이때 특별한 큰 사유가 아니면 주로 트랜잭션 처리를 하게 되는데, 이 트랜잭션이라는것을 간단하게 설명하면
DB 내에서 한꺼번에서 처리되어야 할 일들을 하나로 묶는것을 얘기한다.
즉, 한번에 특정 로직내에서 처리되어야 할 insert와 update가 있다고 가정할때 이 일들은 순차적으로 진행되지만
순차적인 insert, update 과정을 하나의 job 으로 보고 그중에서 1개라도 오류가 발생시 해당 job을 취소한다.
예를 들면 어떤 로직에서 순차적으로 A 라는 테이블에 insert를 진행하고 insert가 완료되면 B라는 테이블의 데이터를 삭제한다고 치자.
A라는 테이블에 insert는 성공적으로 되었다. 하지만 B라는 테이블에서 delete를 하던중 오류가 발생하면,
이 트랜잭션 처리를 한 경우 A 테이블의 insert 되었던 내용된 취소를 시킨다. 즉. 앞서 어떠한 일들이 성공했더라도 무효화 되는셈이다.
트랜잭션 처리를 하지 않을경우, B 테이블에 데이터를 delete 하는중 에러가 발생할 경우 A 테이블에 데이터는 그대로 남게 된다.
그러면 myBatis에서 트랜잭션 처리 하는 방법을 보자.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="com.test.sqlMap.SqlSessionManager"%>
<%@page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@page import="org.apache.ibatis.session.SqlSession"%>
<%@page import="java.util.*"%>
<%
SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
HashMap pHm = new HashMap();
pHm.put("name", "홍길동") ;
pHm.put("age", "28") ;
// Insert
sqlSession.insert("Test.insContents", pHm) ;
// Update
sqlSession.update("Test.updateContents", pHm) ;
// 커밋
sqlSession.commit() ;
}catch(Exception e){
// 롤백
sqlSession.rollback() ;
e.printStackTrace() ;
}finally{
sqlSession.close() ;
}
%>
정상적으로 모든 구문이 수행되면 commit 을 해주는 것이고, 실패하여 Exception 에 걸릴경우 rollback 해주는 것이다.
ibatis2 시절에는 startTransaction 이였던가 하는 구문을 처음 실행해 주었어야 했는데,
myBatis로 버전업 되고나선 해당 구문이 빠졌다.
'MyBatis' 카테고리의 다른 글
| MyBatis3 typeAlias 사용하기 (1) | 2014.08.11 |
|---|---|
| MyBatis3 동적 쿼리(if, choose) (2) | 2014.08.10 |
| MyBatis3 resultType을 자바빈으로 지정하기 (0) | 2014.08.09 |
| MyBatis3 User Guide (0) | 2014.08.08 |
| JSP + MyBatis3 쉽게 적용하기 #2 (0) | 2014.08.08 |