java - DataSourceTransactionManager with myBatis roll back not work -
i trying write demo learn spring transaction. here configuration in spring-config.xml:
<bean id="datasource" class="org.apache.tomcat.jdbc.pool.datasource" destroy-method="close" scope="prototype"> <property name="driverclassname" value="com.mysql.jdbc.driver"/> <property name="url" value="jdbc:mysql://localhost/test"/> <property name="username" value="root"/> <property name="password" value="#bugsfor$"/> </bean> <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource" /> </bean> <tx:advice id="txadvice" transaction-manager="transactionmanager"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="categorydaooperation" expression="execution(* com.ea.test.dao.categorydao.*(..))"/> <aop:advisor advice-ref="txadvice" pointcut-ref="categorydaooperation"/> </aop:config> <!-- define sqlsessionfactory --> <bean id="sqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean"> <property name="datasource" ref="datasource"/> <property name="mapperlocations"> <list> <value>classpath:mapper/categorymapper.xml</value> </list> </property> </bean> <bean id="categorymapper" class="org.mybatis.spring.mapper.mapperfactorybean"> <property name="mapperinterface" value="com.ea.test.mapper.categorymapper"/> <property name="sqlsessionfactory" ref="sqlsessionfactory"/> </bean> <bean id="categorydao" class="com.ea.test.dao.categorydao"> <property name="categorymapper" ref="categorymapper"/> </bean> the following categorydao.java
public class categorydao { categorymapper categorymapper; public void setcategorymapper(categorymapper categorymapper) { this.categorymapper = categorymapper; } public categorydb get(int id) { logger.info("start category id: {}", id); categorydb retvalue = categorymapper.get(id); logger.info("get category id: {} successfully", id); return retvalue; } public void save(categorydb categorydb) { categorymapper.save(categorydb); throw new unsupportedoperationexception("unsupported"); } } categoryservice.java
public class categoryservice { public static void main(string[] args) throws exception { applicationcontext context = new classpathxmlapplicationcontext(new string[] { "spring-config.xml" }); categorydao categorydao = (categorydao) context.getbean("categorydao"); categorydb categorydb = new categorydb(); categorydb.setid(1); categorydb.setname("aaa"); categorydao.save(categorydb); } } here debug log when run it
08/07/15 12:22:40:344: [main]: debug org.springframework.jdbc.datasource.datasourcetransactionmanager - acquired connection [proxyconnection[pooledconnection[com.mysql.jdbc.jdbc4connection@325dc1bc]]] jdbc transaction 08/07/15 12:22:40:348: [main]: debug org.springframework.jdbc.datasource.datasourcetransactionmanager - switching jdbc connection [proxyconnection[pooledconnection[com.mysql.jdbc.jdbc4connection@325dc1bc]]] manual commit 08/07/15 12:22:40:374: [main]: debug org.mybatis.spring.sqlsessionutils - creating new sqlsession 08/07/15 12:22:40:377: [main]: debug org.mybatis.spring.sqlsessionutils - registering transaction synchronization sqlsession [org.apache.ibatis.session.defaults.defaultsqlsession@27589aa5] 08/07/15 12:22:40:407: [main]: debug org.springframework.jdbc.datasource.datasourceutils - fetching jdbc connection datasource 08/07/15 12:22:40:407: [main]: debug org.springframework.jdbc.datasource.datasourceutils - registering transaction synchronization jdbc connection 08/07/15 12:22:40:407: [main]: debug org.mybatis.spring.transaction.springmanagedtransaction - jdbc connection [proxyconnection[pooledconnection[com.mysql.jdbc.jdbc4connection@1d10e937]]] managed spring 08/07/15 12:22:40:408: [main]: debug com.ea.test.mapper.categorymapper.save - ooo using connection [proxyconnection[pooledconnection[com.mysql.jdbc.jdbc4connection@1d10e937]]] 08/07/15 12:22:40:416: [main]: debug com.ea.test.mapper.categorymapper.save - ==> preparing: insert category ( category_id, category_name ) values ( ?, ? ) 08/07/15 12:22:40:456: [main]: debug com.ea.test.mapper.categorymapper.save - ==> parameters: 1(integer), aaa(string) 08/07/15 12:22:40:492: [main]: debug org.mybatis.spring.sqlsessionutils - releasing transactional sqlsession [org.apache.ibatis.session.defaults.defaultsqlsession@27589aa5] 08/07/15 12:22:40:493: [main]: debug org.springframework.jdbc.datasource.datasourcetransactionmanager - initiating transaction rollback 08/07/15 12:22:40:493: [main]: debug org.springframework.jdbc.datasource.datasourcetransactionmanager - rolling jdbc transaction on connection [proxyconnection[pooledconnection[com.mysql.jdbc.jdbc4connection@325dc1bc]]] 08/07/15 12:22:40:494: [main]: debug org.mybatis.spring.sqlsessionutils - transaction synchronization rolling sqlsession [org.apache.ibatis.session.defaults.defaultsqlsession@27589aa5] 08/07/15 12:22:40:494: [main]: debug org.mybatis.spring.sqlsessionutils - transaction synchronization closing sqlsession [org.apache.ibatis.session.defaults.defaultsqlsession@27589aa5] 08/07/15 12:22:40:494: [main]: debug org.springframework.jdbc.datasource.datasourceutils - returning jdbc connection datasource 08/07/15 12:22:40:495: [main]: debug org.springframework.jdbc.datasource.datasourcetransactionmanager - releasing jdbc connection [proxyconnection[pooledconnection[com.mysql.jdbc.jdbc4connection@325dc1bc]]] after transaction 08/07/15 12:22:40:495: [main]: debug org.springframework.jdbc.datasource.datasourceutils - returning jdbc connection datasource exception in thread "main" java.lang.unsupportedoperationexception: unsupported @ com.ea.test.dao.categorydao.save(categorydao.java:40) @ com.ea.test.dao.categorydao$$fastclassbycglib$$c0f75c81.invoke(<generated>) @ net.sf.cglib.proxy.methodproxy.invoke(methodproxy.java:191) @ org.springframework.aop.framework.cglib2aopproxy$cglibmethodinvocation.invokejoinpoint(cglib2aopproxy.java:689) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:150) @ org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:110) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:172) @ org.springframework.aop.interceptor.exposeinvocationinterceptor.invoke(exposeinvocationinterceptor.java:90) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:172) @ org.springframework.aop.framework.cglib2aopproxy$dynamicadvisedinterceptor.intercept(cglib2aopproxy.java:622) @ com.ea.test.dao.categorydao$$enhancerbycglib$$4d1a773e.save(<generated>) @ com.ea.test.service.categoryservice.main(categoryservice.java:25) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:606) @ com.intellij.rt.execution.application.appmain.main(appmain.java:134) the categorydao throw unsupportedoperationexecption, think catetegorymapper.save rollback. not. datasource.defaultautocommit true, catetegorymapper.save should commit before throw unsupportedoperationexecption. , set datasource.defaultautocommit false, found catetegorymapper.save never commit, not matter throwing unsupportedoperationexecption or not. don't know why.
is there wrong in config file or did have misunderstand it. many thanks
i know wrong configuration. make stupid mistake. config scope of datasource prototype. , there 2 different datasource in sqlsessionfactory , transactionmanager. , remove scope works
<bean id="datasource" class="org.apache.tomcat.jdbc.pool.datasource"> <property name="driverclassname" value="com.mysql.jdbc.driver"/> <property name="url" value="jdbc:mysql://localhost/test"/> <property name="username" value="root"/> <property name="password" value="#bugsfor$"/> </bean>
Comments
Post a Comment