您的位置:首页 > 编程语言 > Java开发

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>
<!--而在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