身边一些小伙伴们搭的 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