spring springmvc mybatics 中配置事务不回滚问题。。。

身边一些小伙伴们搭的 spring +springmvc+mybatics 项目,结果一运行发现 配置的事务怎么都无法生效!!!!

哦研究了几天终于有了一定成果

情况1

 在service  层加@Trasactional注解 ,service层整个方法代码做了try catch 处理。然后在程序中手动抛出异常  结果惊奇地发现事务还是提交了。。。

解决办法:

service 层加上@Transactional 注解, 不要用try ...catch.... 抓方法代码,因为如果用户自己处理了异常那么注解处理器不会再处理异常,也不会执行回滚操作。

只有当事务注解处理器 发现代码中抛出了运行期异常才会进行处理,回滚事务(这是默认情况,当然也可以手动修改为发现check例外也回滚)。

或者用 try...catch...处理  ,在catch 代码块中 抛出运行期异常  ,或者在catch 中 手动回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

try{
    xxxxxxx
}catch(Exception e){
  logger.error(e);
throw new RuntimeException(e);
//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}


情况2

service层 加了@Transactional 注解,方法代码也做了try catch 处理,catch中也抛出了Runtime异常。 但是 仔细观察日志发现 事务根本开启  ....... non Transactional 

解决办法:

修改spring和springmvc 的配置文件。 spring中配置的包扫描 排除掉controller层,springmvc中配置的包扫描排除掉service层

   <context:component-scan base-package="com.jelly.easyuidemo">
      <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
   </context:component-scan> 


  <context:component-scan base-package="com.jelly.easyuidemo" >   
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />   
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />  
   </context:component-scan>  



附: log4j.properties 日志配置  能看到非常详尽的日志信息

#log4j.rootLogger=DEBUG, stdout
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n


你可能感兴趣的:(spring springmvc mybatics 中配置事务不回滚问题。。。)