Spring MyBatis 환경에서 아래와 같은 메시지가 나오면서 트랜잭션 정상적으로 작동 안 하는 상황이 있다.


was not registered for synchronization because synchronization is not active

will not be managed by Spring 


TestCase로 Service 계층에서부터 테스트 하면 정상적으로 처리 되는 모습을 보였고, Controller 부분 부터 테스트 하면 실패하는 모습을 보였다.


우선 정상 로그와 비교해보았을때 아래와 같았고, Servlet MVC 부분에 문제로 보여 살펴보았는데 눈에 잘 띄지 않아.. 삽질 하다.. 찾음;;


문제는 <context:component-scan base-package="pe.kr.ddakker">부분에서 하위에 Controller이 아닌 Service 계층이 포함되면 문제가 생기는것이였다.

그리하여 해상 설정에서 Controller 이 아닌 Annotation들을 exclude-filter 해주거나, base-package 부분을 명확하게 구분되게 해주면 되겠다.



[servlet-mvc.xml]


	
	

	
	


[Log]

-- 비 정상
[DEBUG] org.mybatis.spring.SqlSessionUtils[getSqlSession:140] - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4c1c68d3] was not registered for synchronization because synchronization is not active 
[DEBUG] org.mybatis.spring.transaction.SpringManagedTransaction[openConnection:86] - JDBC Connection [jdbc:oracle:thin:@ip:1521:sid, UserName=id, Oracle JDBC driver] will not be managed by Spring 

-- 정상
[DEBUG] org.mybatis.spring.SqlSessionUtils[getSqlSession:120] - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@49ffa050] 
[DEBUG] org.mybatis.spring.transaction.SpringManagedTransaction[openConnection:86] - JDBC Connection [jdbc:oracle:thin:@ip:1521:test, UserName=STAT, Oracle JDBC driver] will be managed by Spring 

propagation="REQUIRED" read-only="true"


Spring AOP Transaction 과 관련하여 와와 같이 설정 하였을 경우 해당 설정이 적용되는 트랜잭션의 경우 insert/update/delete가 일어난다면 ".. TransientDataAccessResourceException .. java.sql.SQLException: Connection is read-only. .." 와 같은 예외가 나면서 중지되어야 한다고 인터넷, 책 등등에 설명이 잘 되어있다.


하지만... 안됐다.. 개삽질 했다.. 몇시간을 삽질한지 모르겠다..

별 셈플링을 다 해봤다.. 안됐다..


그런데 DB가 MYSQL로 셈플링 한 프로젝트에서 동일하게 적용해보았으나 잘 되었다.


이것저것 찾아보니 DBMS Vendor따라서.. 안될 수도 있단다..



[참고] https://groups.google.com/forum/#!searchin/ksug/AOP$20트랜잭션$20설정에$20대해서../ksug/tVLRWx8R_B4/iCL_Cz6VWzMJ

+ Recent posts