博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring boot controller设置 @Transactional 不回滚的解决办法
阅读量:6300 次
发布时间:2019-06-22

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

在spring boot 中,使用事务非常简单,直接在方法上面加入@Transactional 就可以实现,以下是我的做法

@GetMapping("delete")     @ResponseBody     @Transactional public void delete(@RequestParam("id") int id){
try {
//delete country this.repository.delete(id); if(id == 1){
throw Exception("测试事务"); } //delete city this.repository.deleteByCountryId(id); }catch (Exception e){
logger.error("delete false:" + e.getMessage()); return new MessageBean(101,"delete false"); } }

发现事务不回滚,即 this.repository.delete(id); 成功把数据删除了。

原因:

默认spring事务只在发生未被捕获的 RuntimeException 时才回滚。  

spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获 RuntimeException 的异常,但可以通过配置来捕获特定的异常并回滚  
换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚
解决方案:
  方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理
  方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常

 

1     @GetMapping("delete")  2     @ResponseBody  3     @Transactional  4     public Object delete(@RequestParam("id") int id){
5 if (id < 1){
6 return new MessageBean(101,"parameter wrong: id = " + id) ; 7 } 8 try {
9 //delete country 10 this.countryRepository.delete(id); 11 //delete city 12 this.cityRepository.deleteByCountryId(id);13 return new MessageBean(200,"delete success"); 14 }catch (Exception e){
15 logger.error("delete false:" + e.getMessage()); 16 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 17 return new MessageBean(101,"delete false");18 } 19 }

 

转载地址:http://wvgta.baihongyu.com/

你可能感兴趣的文章
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
用CSS画一个带阴影的三角形
查看>>
solr-4.10.4部署到tomcat6
查看>>
切片键(Shard Keys)
查看>>
淘宝API-类目
查看>>
virtualbox 笔记
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
MyBatis-Plus | 最简单的查询操作教程(Lambda)
查看>>
rpmfusion 的国内大学 NEU 源配置
查看>>
spring jpa 配置详解
查看>>