SpringMVC结合Mybatis事务失效的问题

这几天一直在写自己的代码,碰到了事务问题,原本以为事务这块没什么可说得,结果这问题卡了两个晚上才解决,搜了一大堆材料,特此总结一下。

1、事务失效一般问题是配置问题,SpringMVC和SSH的配置不太一样,如果按照SSH的事务配置照搬过来,定会使事务失效。

先列一下昨天LOG4J报的信息。

<2014-06-28 00:12:29>  org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:110) 
 Fetching JDBC Connection from DataSource


<2014-06-28 00:12:29>  org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:49) 
 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,配置如下:



  


  
  
  

之后,可以根据事务的配置方法,如:声明式或注解形式去进行配置,这里不再赘述。


2、还有一种情况,虽然我没有遇到,但是还是提一下,如果使用的是Mysql,需要把Engine设置为InnoDb,自动创建表的是MyIsm(好像是这个名),不支持事务。
 

最后我采用的是声明式方法,利用SPRING AOP将事务织入代码,我把这块配置也贴一下,方便未来使用。。默认搜索com包及其所有子包下,名称为business的包,该包下以Business为名称结尾的接口的所有方法,如果方法名中包含_tx则开启事务,否则不开启事务,无法写入。。说的好拗口。。

	
		
	
	
	
		
		
	

	
		
			
			
		
	


你可能感兴趣的:(spring相关)