http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=40288
처음에는 어느 블로그에서 글을 보고
그걸 바탕으로 조사를 했었는데, 위 기고문의 내용을 보니...
처음 참고하였던 그 블로그와는 내용이 조금 다른(?.. 결과적으로는 같지만.. 과정 설명이 좀 다른.. )..
좀 미묘하게 차이가 나는 부분이 있어서 위 글을 보고 소스를 열어서 참고해보았다.
일단.... ibatis의 아래 설정에 의해서..
<transactionManager type=”JDBC”>
....
</transactionManager>
ibatis에서 JDBCTransaction이 사용되고.. 거기서 아래와 같이 connection.setAutoCommit(false)가 실행됨..
if(conn.getAutoCommit()) {
conn.setAutoCommit(false);
}
ibatis에서 commit을 실행하는 조건은
if (session.isCommitRequired() || forceCommit) {
trans.commit();
session.setCommitRequired(false);
}
session.isCommitRequired는 sqlMapClient에서 excuteUpdate등을 실행 할 때 true로 셋팅되며
forceCommit은 ibatis설정에서 commitRequired=true를 설정하면 true가 된다.
디폴트 설정에서는 forceCommit은 항상 false이기 때문에, JDBC Connection의 autoCommit이 항상 true라고 하더라도..
맨 위에서 false가 되어버리지만.. update, delete에서는 commitRequired에 의해서 commit이 이루어진다.
반대로 ibatis의 transaction설정에서 commitRequired=true라면..select문에 대해서도 무조건 commit이 실행됨.
그러면...디폴트 설정에서 select 실행시에는 autocommit=false인 상태로 connection이 반환되는건가?
아래의 DBCP의 PoolabledConnectionFactory를 보면 connection을 반환할때 아래의 문장이 실행되는데
if(!conn.getAutoCommit() && !conn.isReadOnly()) {
conn.rollback();
}
conn.clearWarnings();
if(!conn.getAutoCommit()) {
conn.setAutoCommit(true);
}
autoCommit은 false인 상태이므로...