博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring @Transactional annotation 不回滚
阅读量:6390 次
发布时间:2019-06-23

本文共 1089 字,大约阅读时间需要 3 分钟。

hot3.png

1【问题重现】

基于annotation配置,使用

org.springframework.web.WebApplicationInitializer

启动的web app, IoC容器继承自

org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter

而不使用传统的在web.xml 配置方式。

加上一下注解:

 

@Configuration@EnableWebMvc@ComponentScan(basePackages = "org.richard.wu")@PropertySource("classpath:jdbc.properties")@EnableTransactionManagement //事物注解public class AppConfig extends WebMvcConfigurerAdapter {}

在service类加上@Transactional后故意在2 update操作之间抛出一个

java.lang.ArithmeticException

 那么问题来了,检验发现第一个update 操作居然没有被回滚!!!

【解决】

仔细看了文档发现spring 的@Transactionl 仅仅在

RunTimeException

才回滚,所以为了让他对所有Exception回滚,必须这样写:

@Transactional(propagation= Propagation.REQUIRED, rollbackFor=Exception.class, readOnly=false)

关键是rollbackFor这个参数。但是改了之后发现还是不能如期回滚,百思不得姐,后来突然想到既然@Transactionl是通过异常类型来触发回滚的,然么关键就是要有异常从方法里面传递出来,再看看代码里面已经把异常部分用try catch住了,恍然大悟,赶紧解除try catch块,果然就ok了。又或者在catch到Exception后再次抛出也是可以的:

try {        //update 1        //exception occur here        //update 2    }catch (SQLException e){        throw new SQLException( "出现SQL异常,回滚操作1");    }

 

 

 

 

 

转载于:https://my.oschina.net/u/1015065/blog/396233

你可能感兴趣的文章
翻转单词顺序与左旋转字符串
查看>>
在Zf2中实现Controller按照URL自动注册
查看>>
自定义Seekbar拖动条式样
查看>>
企业关键词标题生成
查看>>
配置Citrix Receiver 3.x、4.x支持添加HTTP站点
查看>>
崩溃解决心得
查看>>
批处理的变量引用
查看>>
oracle ORACLE_SID使用上的意义
查看>>
我的友情链接
查看>>
RHEL5下安装Xen
查看>>
HTML5 INPUT placeholder及兼容性处理
查看>>
Vue-router(三) 参数传递
查看>>
2011百度之星初赛B圆环
查看>>
《转》VMware vSphere 5.1 学习系列之四:安装 SQL Server 数据库
查看>>
网页主动探测工具使用
查看>>
数组-splice
查看>>
React多页面应用脚手架-v1.3.0
查看>>
Git 取消上一次commit操作,但保留add操作
查看>>
javascript 判断浏览器
查看>>
软件配置管理
查看>>