본문 바로가기
language/java

Hibernate Transaction (OSIV 패턴) : org.hibernate.TransactionException: Transaction not successfully started

by vamalboro 2009. 6. 21.
Transaction 이란.
  : 컴퓨터 프로그램에서 트랜잭션의 일반적인 의미는 정보의 교환이나 데이터베이스 갱신 등
    연관되는 작업들에 대한 일련의 연속을 의미한다. (http://www.terms.co.kr/transaction.htm)

이번 프로젝트에 ORM이 무엇인지도 처음 들었고 또한 ORM프레임워크중에 한 종류인 Hibernate또한
처음 사용해보면서 느꼈던 점은 ..

어렵다 이다.-_-; 마냥 어려운거임.

뭐 어찌됐든 프로그래머로써 Transaction을 무시할 수 있는 프로그래머는 없을터.

프로젝트를 진행하던 도중 org.hibernate.TransactionException: Transaction not successfully started의

예외상황이 자꾸 발생하길래 디버깅 고고.

(사실은 무시하려했지만 심각 :
 Servlet.service() for servlet default threw exception이라는 메세지만 내가 보지 못했더라면...ㅋㅋ)

현재 MVC 프레임워크로 Struts2를 사용하고 있는데 이 에러가 나는 페이지들을 검사해 보았더니

Action이 Chain으로 묶여있는(연쇄호출되는) 요청들은 다 이 예외를 뱉어내고 있었다.

트랜잭션 begin -> 커밋 or 롤백 -> 트랜잭션 close의 정상적인 과정이 아닌 중간에 커밋하지 않고 begin을 두번 수행하는걸 발견 (커밋이 두번이였던가.-_-;; 뭐어쨌든 발견했다는게 중요한거 아니겠음?)

현재 트랜잭션의 코딩 패턴은 OSIV패턴(Open session in view)으로 구현되어있었고.
(최범균저 (Hibernate3 프로그래밍) 책에 나와있는 패턴)

책에는 Servlet Filter로 구현되어있었지만 현재 프로젝트에선 Interceptor로 구현.

정확하고 자세한 건 Struts2의 Interceptor의 아키텍쳐를 다시 한번 봐야겠지만

Chain으로 또 다른 Action을 수행할때에 다시 한번 Interceptor를 타기때문에 commit하기도 전에 또다시

Transaction을 begin하는것 같았다.

결국 Interceptor로 구현되어있는 Transaction처리 로직을 Servlet Filter로 재구현해서 테스트해서

다행히 이 문제를 해결.

(또 나면 어쩌지?ㅠㅠ)




이 포스팅을 100% 전적으로 믿지 마세요.(나중에 또 이상황이 발생했을때 참고하려고 적는 글입니다.)