트랜잭션관련 문의 입니다. 많은 조언 바랍니다.

7,072 views
Skip to first unread message

Funtastic

unread,
Jun 6, 2013, 10:09:01 PM6/6/13
to ks...@googlegroups.com


안녕하세요. 회원님들

지금 사이트에서 개발 중 트랜잭션을 적용하는 중에 이슈가 발생해서 혼자서 열심히 책, 인터넷 검색하면서 열심히 삽질해도 안되서

회원님들에게 마지막으로 조언을 부탁드리고자 글을 남깁니다. 


개발환경은 Spring MVC 3.1.3,  Mybatis 3.2.0, Mybatis-spring 1.2.0 , MySQL 5.5 , Tomcat 7 버전으로 구성되어있습니다.


실질적인 비즈 영역에서 아래니스 로직의 코드가 트랜잭션 처리되는게 목적이었는데.






실행 후 로그 입니다. .. 로그에는 분명 트랜잭션이 적용이 되었다고 판단됩니다.

10:42:04,507 DEBUG http-bio-8080-exec-3 servlet.DispatcherServlet:819 - DispatcherServlet with name 'kspaServlet' processing POST request for [/mgt/logis/goods/regist/insert]
10:42:04,508 DEBUG http-bio-8080-exec-3 annotation.RequestMappingHandlerMapping:209 - Looking up handler method for path /mgt/logis/goods/regist/insert
10:42:04,508 DEBUG http-bio-8080-exec-3 annotation.RequestMappingHandlerMapping:216 - Returning handler method [public org.springframework.web.servlet.ModelAndView com.ttnet.gumzzi.web.mgt.logis.goods.GD_Regist.insert(java.util.Map<java.lang.String, java.lang.String>) throws java.lang.Exception]
10:42:04,508 DEBUG http-bio-8080-exec-3 support.DefaultListableBeanFactory:245 - Returning cached instance of singleton bean 'GD_Regist'
10:42:04,509  INFO http-bio-8080-exec-3 common.CommonInterceptor:50 - Interceptor - preHandle
10:42:04,519 DEBUG http-bio-8080-exec-3 support.DefaultListableBeanFactory:245 - Returning cached instance of singleton bean 'transactionManager'
10:42:04,529 DEBUG http-bio-8080-exec-3 datasource.DataSourceTransactionManager:365 - Creating new transaction with name [com.ttnet.gumzzi.web.mgt.logis.goods.GD_Regist.insert]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; ''
10:42:04,531 DEBUG http-bio-8080-exec-3 datasource.DataSourceTransactionManager:204 - Acquired Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@edb787]]] for JDBC transaction
10:42:04,534 DEBUG http-bio-8080-exec-3 datasource.DataSourceUtils:187 - Changing isolation level of JDBC Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@edb787]]] to 2
10:42:04,569 DEBUG http-bio-8080-exec-3 spring.SqlSessionUtils:106 - Creating a new SqlSession
10:42:04,584 DEBUG http-bio-8080-exec-3 spring.SqlSessionUtils:122 - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a3d7d0]
====================================
insert
====================================
10:42:04,622 DEBUG http-bio-8080-exec-3 datasource.DataSourceUtils:110 - Fetching JDBC Connection from DataSource
10:42:04,623 DEBUG http-bio-8080-exec-3 log4jdbc.debug:506 - driver name is MySQL-AB JDBC Driver
10:42:04,623  INFO http-bio-8080-exec-3 jdbc.connection:518 - 2. Connection opened  org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
10:42:04,623 DEBUG http-bio-8080-exec-3 jdbc.connection:520 - open connections:  2 (1)
10:42:04,623 DEBUG http-bio-8080-exec-3 datasource.DataSourceUtils:114 - Registering transaction synchronization for JDBC Connection
10:42:04,625 DEBUG http-bio-8080-exec-3 transaction.SpringManagedTransaction:85 - JDBC Connection [net.sf.log4jdbc.ConnectionSpy@9eb1b4] will be managed by Spring
10:42:04,626 DEBUG http-bio-8080-exec-3 gd_regist.insert:132 - ooo Using Connection [net.sf.log4jdbc.ConnectionSpy@9eb1b4]
10:42:04,631 DEBUG http-bio-8080-exec-3 gd_regist.insert:132 - ==>  Preparing: INSERT INTO test_table ( p_id ,nm ) VALUES ( ? ,? ) 
10:42:04,673 DEBUG http-bio-8080-exec-3 gd_regist.insert:132 - ==> Parameters: 11(String), 첫번째값(String)
[2013-06-07 10:42:04] - SQL::: INSERT INTO test_table
(
p_id
,nm
)
VALUES
(
'11'
,'첫번째값'
)
10:42:04,687 DEBUG http-bio-8080-exec-3 spring.SqlSessionUtils:165 - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a3d7d0]
10:42:04,688 DEBUG http-bio-8080-exec-3 spring.SqlSessionUtils:99 - Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a3d7d0] from current transaction
====================================
.insert
====================================
10:42:04,688 DEBUG http-bio-8080-exec-3 gd_regist.insert:132 - ooo Using Connection [net.sf.log4jdbc.ConnectionSpy@9eb1b4]
10:42:04,688 DEBUG http-bio-8080-exec-3 gd_regist.insert:132 - ==>  Preparing: INSERT INTO test_table ( p_id ,nm ) VALUES ( ? ,? ) 
10:42:04,689 DEBUG http-bio-8080-exec-3 gd_regist.insert:132 - ==> Parameters: 12(String), 두번째값(String)
[2013-06-07 10:42:04] - SQL::: INSERT INTO test_table
(
p_id
,nm
)
VALUES
(
'12'
,'두번째값'
)
10:42:04,695 DEBUG http-bio-8080-exec-3 spring.SqlSessionUtils:165 - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a3d7d0]
10:42:04,698 DEBUG http-bio-8080-exec-3 datasource.DataSourceTransactionManager:752 - Initiating transaction commit
10:42:04,699 DEBUG http-bio-8080-exec-3 datasource.DataSourceTransactionManager:264 - Committing JDBC transaction on Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@edb787]]]
10:42:04,708 DEBUG http-bio-8080-exec-3 spring.SqlSessionUtils:277 - Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a3d7d0]
10:42:04,710 DEBUG http-bio-8080-exec-3 spring.SqlSessionUtils:298 - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a3d7d0]
10:42:04,711 DEBUG http-bio-8080-exec-3 datasource.DataSourceUtils:332 - Returning JDBC Connection to DataSource
10:42:04,712  INFO http-bio-8080-exec-3 jdbc.connection:537 - 2. Connection closed  org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:333)
10:42:04,712 DEBUG http-bio-8080-exec-3 jdbc.connection:539 - open connections:  none
10:42:04,713 DEBUG http-bio-8080-exec-3 datasource.DataSourceUtils:213 - Resetting isolation level of JDBC Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@edb787]]] to 4
10:42:04,720 DEBUG http-bio-8080-exec-3 datasource.DataSourceTransactionManager:322 - Releasing JDBC Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@edb787]]] after transaction
10:42:04,720 DEBUG http-bio-8080-exec-3 datasource.DataSourceUtils:332 - Returning JDBC Connection to DataSource
10:42:04,721  INFO http-bio-8080-exec-3 common.CommonInterceptor:60 - Interceptor - postHandle
10:42:04,722 DEBUG http-bio-8080-exec-3 support.DefaultListableBeanFactory:245 - Returning cached instance of singleton bean 'xmlView'
10:42:04,722 DEBUG http-bio-8080-exec-3 servlet.DispatcherServlet:1178 - Rendering view [com.ttnet.gumzzi.common.OutputToXML: name 'xmlView'] in DispatcherServlet with name 'kspaServlet'
10:42:04,723  INFO http-bio-8080-exec-3 common.CommonInterceptor:94 - Interceptor - afterCompletion
10:42:04,723 DEBUG http-bio-8080-exec-3 servlet.DispatcherServlet:913 - Successfully completed request


제가 이해한게 맞는거라면 분명히 로그에 빨간색으로 표시한 부분에서 한 트랜잭션이 끝나서 Commit 이 되어야하는게 맞는거 아닌가요?


그런데 실제로 DB 에서 조회를 해보면..



데이터가 안들어갑니다..  그럼 Commit 이 안됬다는 이야기인가..


DELETE TABLE 로 삭제를 시도해보았는데요. 한참을 있다가. 아래와 같은 에러를 뱉어냅니다.

저 에러까지 봤을때 Commit 이 안되서 Table Lock 이 걸린게 아닌가요 ㅠㅠ?

결국 Tomcat 서비스를 내렸다가 올리면 Lock 이 해제됩니다.


롤백도 위와 마찬가지로 되지 않구요.. JDBC 에서 트랜잭션을 커밋후 종료시키지 않는 문제인거같은데 이건 어디를 봐야하는지 잘 모르겠습니다;;

Tomcat Server XML 에 JNDI 설정으로 DB Connection 사용했구요.


Autocommit 도 기본 false 로 되어있습니다. true 로 설정하면 Lock 이 걸리지 않고 들어가는 족족 데이터가 insert 는 됩니다. Transaction 적용은 안되구요.



아래는 Web.xml 설정입니다. 관련 부분만 보여드리겠습니다.


Servlet-Context.xml 파일내 관련 부분입니다.



Datasource-context.xml 파일내 관련 부분입니다.




회원님들의 많은 조언 부탁드립니다. 이 게시물은 게시 후 모니터링 하겠습니다. 조언해주시면 바로바로 적용해보겠습니다 . 감사합니다!(__)

이수홍

unread,
Jun 6, 2013, 10:25:18 PM6/6/13
to ks...@googlegroups.com
일단 훝어 봤는데 먼저 이해 안되는 소스 좀 있지만 패스 하고 

먼저 sqlSessionFactory 에서 사용하는 데이타소스(logDataSource)와

트랜잭션에서 사용하는 데이타소스(dataSource)가 다른것 같네요 

그부분이 먼저 문제가 발생하는게 아닌가 생각됩니다.

문제와 관련없이 controller단 소스는 약간 이해가 안가네요 ^^;; 일단 이건 패스

2013. 6. 7., 오전 11:09, Funtastic <upstyle...@gmail.com> 작성:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug?hl=ko-KR에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 

Funtastic

unread,
Jun 6, 2013, 10:33:34 PM6/6/13
to ks...@googlegroups.com
코바님 빠른 피드백 감사합니다.!!!

이해가 안되시는 코드를 질문으로 올려서 혼란스럽게 해드렸네요 ;ㅠㅜ 

logDataSource 는 중간에 Query 로그 찍는 부분인데.. 조언해주신대로 sqlSessionFactory가 logDatasource 를 보고있었네요..

바꿔보니

SqlSessionFactory must be using a SpringManagedTransactionFactory in order to use Spring transaction synchronization

에러가 떨어지는데.. 왠지 느낌 좋은 에러같습니다.. ㅠㅠ 감사합니다.


2013년 6월 7일 금요일 오전 11시 25분 18초 UTC+9, 코바(이수홍) 님의 말:

이수홍

unread,
Jun 6, 2013, 10:39:57 PM6/6/13
to ks...@googlegroups.com
sqlSessionFactory 부분에서
transactionFactory 부분 클래스를 
<bean class="org.mybatis.spring.transaction.SpringManagedTransactionFactory">
<constructor-arg index="0" ref="dataSource" />
</bean>
이렇게 바꿔 주세요
2013. 6. 7., 오전 11:09, Funtastic <upstyle...@gmail.com> 작성:

Funtastic

unread,
Jun 6, 2013, 10:49:26 PM6/6/13
to ks...@googlegroups.com
코바님 감사합니다! 지금 알려주신대로 적용해보겠습니다 ( _ _ )

2013년 6월 7일 금요일 오전 11시 39분 57초 UTC+9, 코바(이수홍) 님의 말:

이수홍

unread,
Jun 7, 2013, 5:00:01 AM6/7/13
to ks...@googlegroups.com
참고로 저부분 디폴트가 SpringManagedTransactionFactory 입니다. 
즉 안넣어도 된다는거죠. 저게 사용된다는 것만 알고 계시면 될듯합니다 ㅎ

2013. 6. 7., 오전 11:49, Funtastic <upstyle...@gmail.com> 작성:
Reply all
Reply to author
Forward
0 new messages