수많은 일들을 하다보면 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 |