SpringMVC结合Mybatis事务失效的问题
2014-06-29 00:38
239 查看
这几天一直在写自己的代码,碰到了事务问题,原本以为事务这块没什么可说得,结果这问题卡了两个晚上才解决,搜了一大堆材料,特此总结一下。
1、事务失效一般问题是配置问题,SpringMVC和SSH的配置不太一样,如果按照SSH的事务配置照搬过来,定会使事务失效。
先列一下昨天LOG4J报的信息。
<2014-06-28 00:12:29> <http-bio-8080-exec-4> org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:110)
<DEBUG> Fetching JDBC Connection from DataSource
<2014-06-28 00:12:29> <http-bio-8080-exec-4> org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:49)
<DEBUG> JDBC Connection [com.mysql.jdbc.JDBC4Connection@66c9f0e7] will not be managed by Spring
这一句JDBC连接未在Spring管理范围内,导致事务失效。下面来说一下原因:
由于采用的是SpringMVC、 MyBatis,故统一采用了标注来声明Service、Controller
服务器启动时的加载配置文件的顺序为web.xml--applicationContext.xml--XXX-servlet.xml(SpringMVC的配置文件),由于applicationContext.xml配置文件中Controller会先进行扫描装配,但是此时service还没有进行事务增强处理,得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力),所以我们必须在applicationContext.xml中不扫描Controller,配置如下:
<!-- 自动扫描组件,<span style="color: rgb(69, 69, 69); font-family: tahoma, helvetica, arial; font-size: 14px; line-height: 21px;">在<span style="font-family: Helvetica, Tahoma, Arial, sans-serif;font-size:14px; line-height: 25.1875px;">applicationContext</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif;font-size:14px; line-height: 25.1875px;">.xml</span>配置文件中将<span style="font-family: Helvetica, Tahoma, Arial, sans-serif;font-size:14px; line-height: 25.1875px;">Controller</span>注解给去掉</span> -->
<span style="color: rgb(69, 69, 69); font-family: tahoma, helvetica, arial; font-size: 14px; line-height: 21px;"><context:component-scan base-package="com">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan></span>
之后,可以根据事务的配置方法,如:声明式或注解形式去进行配置,这里不再赘述。
2、还有一种情况,虽然我没有遇到,但是还是提一下,如果使用的是Mysql,需要把Engine设置为InnoDb,自动创建表的是MyIsm(好像是这个名),不支持事务。
最后我采用的是声明式方法,利用SPRING AOP将事务织入代码,我把这块配置也贴一下,方便未来使用。。默认搜索com包及其所有子包下,名称为business的包,该包下以Business为名称结尾的接口的所有方法,如果方法名中包含_tx则开启事务,否则不开启事务,无法写入。。说的好拗口。。
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<aop:config>
<aop:pointcut id="pointcutServiceMethods"
expression="execution(* com..*.business.*Business.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutServiceMethods" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*_tx" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
1、事务失效一般问题是配置问题,SpringMVC和SSH的配置不太一样,如果按照SSH的事务配置照搬过来,定会使事务失效。
先列一下昨天LOG4J报的信息。
<2014-06-28 00:12:29> <http-bio-8080-exec-4> org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:110)
<DEBUG> Fetching JDBC Connection from DataSource
<2014-06-28 00:12:29> <http-bio-8080-exec-4> org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:49)
<DEBUG> JDBC Connection [com.mysql.jdbc.JDBC4Connection@66c9f0e7] will not be managed by Spring
这一句JDBC连接未在Spring管理范围内,导致事务失效。下面来说一下原因:
由于采用的是SpringMVC、 MyBatis,故统一采用了标注来声明Service、Controller
服务器启动时的加载配置文件的顺序为web.xml--applicationContext.xml--XXX-servlet.xml(SpringMVC的配置文件),由于applicationContext.xml配置文件中Controller会先进行扫描装配,但是此时service还没有进行事务增强处理,得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力),所以我们必须在applicationContext.xml中不扫描Controller,配置如下:
<!-- 自动扫描组件,<span style="color: rgb(69, 69, 69); font-family: tahoma, helvetica, arial; font-size: 14px; line-height: 21px;">在<span style="font-family: Helvetica, Tahoma, Arial, sans-serif;font-size:14px; line-height: 25.1875px;">applicationContext</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif;font-size:14px; line-height: 25.1875px;">.xml</span>配置文件中将<span style="font-family: Helvetica, Tahoma, Arial, sans-serif;font-size:14px; line-height: 25.1875px;">Controller</span>注解给去掉</span> -->
<span style="color: rgb(69, 69, 69); font-family: tahoma, helvetica, arial; font-size: 14px; line-height: 21px;"><context:component-scan base-package="com">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan></span>
<!--而在springMVC配置文件中将Service注解给去掉--> <context:component-scan base-package="com"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>
之后,可以根据事务的配置方法,如:声明式或注解形式去进行配置,这里不再赘述。
2、还有一种情况,虽然我没有遇到,但是还是提一下,如果使用的是Mysql,需要把Engine设置为InnoDb,自动创建表的是MyIsm(好像是这个名),不支持事务。
最后我采用的是声明式方法,利用SPRING AOP将事务织入代码,我把这块配置也贴一下,方便未来使用。。默认搜索com包及其所有子包下,名称为business的包,该包下以Business为名称结尾的接口的所有方法,如果方法名中包含_tx则开启事务,否则不开启事务,无法写入。。说的好拗口。。
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<aop:config>
<aop:pointcut id="pointcutServiceMethods"
expression="execution(* com..*.business.*Business.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutServiceMethods" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*_tx" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
相关文章推荐
- springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
- springMVC注解配置事务失效的问题(精)
- mybatis整合spring、springmvc时业务层无法进行事务回滚问题解决
- SpringMVC Mybatis的事务回滚问题
- springmvc 结合使用mybatis 的问题汇总
- 解决spring、springMVC重复扫描导致事务失效的问题
- spring+springmvc+mybatis事务失效问题
- springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
- MyBatis和SpringMVC集成事务在Junit测试下有效但是在实际项目无效的问题
- SpringMVC事务失效的一种情况-bean加载顺序问题
- 解决spring、springMVC重复扫描导致事务失效的问题
- java-mybatis、springmvc 整合,使用 @Transactional 时遇到的事务相关问题
- 关于SpringMVC事务失效的分析
- 关于同时用Spring和SpringMVC配置文件,导致事务失效的分析
- springmvc与axis2结合的问题二
- springmvc mybatis 注解的方式 事务不起作用解决方案
- Spring Data JPA配置事务失效问题解决
- spring与mybatis整合的事务问题记录
- SpringMVC + Spring + MyBatis 学习笔记:SpringMVC和Spring一同工作的时候,AOP事务管理不起作用的解决方法
- springMVC之事务配置(问题来源:为什么数据保存不了)