SpringMVC+MyBatis 선언식 트랜잭션 관리

기본 구축 환경: SpringMVC, MyBatis, MySQL, tomcat
Spring 사무 관리는 전통적인 전역 사무 관리와 로컬 사무 관리의 열세를 분해하여 어떠한 환경에서도 통일된 사무 관리 모델을 사용할 수 있게 한다. 코드를 한 번 작성한 다음에 서로 다른 환경에서 서로 다른 사무 관리 전략을 설정할 수 있다. Spring은 두 가지 사무 관리 전략을 제공한다. 하나는 성명식 사무 관리 전략이고 다른 하나는 프로그래밍 사무 관리 전략이다.여기서 주로 성명식 사무 관리 전략을 소개합니다
SpringMVC, MyBatis를 사용하기 때문에 서비스, Controller를 설명하기 위해 마크업을 통일적으로 사용했습니다.
서버가 시작될 때 프로필을 불러오는 순서가 웹이기 때문입니다.xml---root-context.xml(Spring 구성 파일) ---servlet-context.xml(SpringMVC의 프로필), root-context.xml 프로필에서 Controller는 스캔 조립을 먼저 진행하지만 서비스가 아직 사무 강화 처리를 하지 않았습니다. 원래의 서비스 (사무 강화 처리를 거치지 않았기 때문에 사무 처리 능력이 없습니다) 를 얻을 수 있기 때문에 루트-context에 있어야 합니다.xml에서 Controller를 스캔하지 않고 다음과 같이 구성합니다.

<!--  , controler  controller , spring3-servlet.xml , 。  --> 
 <context:component-scan base-package="com.sence"> 
 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />  
 .</context:component-scan> 
 <!--  , controler  controller , spring3-servlet.xml , 。  -->
 <context:component-scan base-package="com.sence">
 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
 </context:component-scan>
servlet-context.xml에서 Controller를 스캔하는 동시에 서비스를 스캔하지 않습니다. 구성은 다음과 같습니다.

<!--  controller  service--> 
 <context:component-scan base-package="com.sence"> 
 <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> 
 </context:component-scan> 
 <!--  controller  service-->
 <context:component-scan base-package="com.sence">
 <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
 </context:component-scan>
다음과 같이 구성 선언식 트랜잭션 관리를 수행할 수 있습니다.

<!-- transaction manager, use DataSourceTransactionManager --> 
 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
 <property name="dataSource" ref="dataSource" /> 
 </bean> 
 <!-- spring declarative transaction management --> 
 <aop:config> 
 <aop:pointcut id="fooServiceMethods"  
 expression="execution(* com.sence.*.service.impl.*.*(..))"/>  
 <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/>  
 </aop:config> 
 <tx:advice id="txAdvice" transaction-manager="txManager"> 
 <tx:attributes> 
 <tx:method name="find*" read-only="true"/> 
 <tx:method name="load*" read-only="true"/> 
 <tx:method name="*" rollback-for="CustomException"/> 
 </tx:attributes> 
 </tx:advice> 
 <!-- transaction manager, use DataSourceTransactionManager -->
 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource" />
 </bean>
 <!-- spring declarative transaction management -->
<aop:config>
 <aop:pointcut id="fooServiceMethods" 
 expression="execution(* com.sence.*.service.impl.*.*(..))"/> 
 <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/> 
 </aop:config>
 <tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
 <tx:method name="find*" read-only="true"/>
 <tx:method name="load*" read-only="true"/>
 <tx:method name="*" rollback-for="CustomException"/>
 </tx:attributes>
 </tx:advice>
이 설정을 완성했습니다. 하지만 테스트를 통해 MySQL 데이터베이스 테이블에 대상을 대량으로 추가할 때 그 중 한 대상에 오류가 발생했을 때 CustomException 업무를 던져도 굴러가지 않습니다. 이것은 정말 골치 아픕니다. 그래서 저는 계속 찾았습니다. 절차는 다음과 같습니다.
1. 성명식 사무 관리가 잘못되었는지 확인합니다. 예를 들어 삽입점이 잘못 쓴 경우
2. Controller 스캔 섹션 구성이 올바른지 찾기
그러나 이 두 가지를 모두 조사했는데 여전히 업무가 굴러가지 않았다. 이때 나는 어쩔 수 없이 궁극의 무기를 사용할 수 밖에 없었다. 원본 코드를 보고 debug 프로그램을 시작했는데 업무에 들어갔고 이상이 생겼다. 포획한 후에 굴러 프로그램에 들어갔지만 데이터베이스는 굴러가지 않았다. 스프링 자신의 Abstract Platform Transaction Manager의 방해를 피하기 위해저는 자체적으로 사무 관리 클래스를 만들고 프로필에 있는 DataSourceTransactionManager 클래스를 계승했습니다. 이렇게 하면 프로그램의 운행 궤적을 똑똑히 볼 수 있고 계속 DEBUG를 할 수 있습니다. 이상이 발생했습니다. 캡처한 후에 롤러 프로그램에 들어갔지만 데이터베이스가 롤러되지 않았습니다. 이때 저는 MySQL 데이터베이스의 사무 지원 기능을 의심하기 시작했습니다. 그래서 인터넷에서 MySQL이 사무에 대한 지원을 찾았습니다.MySQL4.0을 발견한 후에 업무를 지원할 수 있지만 MySql의 데이터 테이블은 두 종류로 나뉘는데 하나는 전통적인 데이터 테이블이고 다른 하나는 업무를 지원하는 데이터 테이블이다.트랜잭션 지원 데이터 시트는 InnoDB 및 Berkeley DB 두 가지로 구성됩니다.
명령을 사용하십시오: showcreate table**** 제 데이터베이스 테이블의 속성을 보고 제 테이블이 원래 전통적인 형식의 테이블이라는 것을 발견했습니다. 그래서 나비캣을 사용하여 테이블의 형식을 변경했습니다. InnoDB입니다. 그리고 프로그램을 실행하면 업무가 굴러가는 것을 발견했습니다.
이 SpringMVC 선언식 트랜잭션 관리 구성 완료 및 올바른 실행

좋은 웹페이지 즐겨찾기