MyBatis

JSP + MyBatis3 트랜잭션 처리

과일가게 개발자 2014. 8. 10. 11:53
반응형

수많은 일들을 하다보면 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로 버전업 되고나선 해당 구문이 빠졌다.