spring在service层的方法报错事务不会回滚的解决

目录
  • spring在service层方法报错事务不会回滚
    • 解决方法
  • service手动回滚问题

spring在service层方法报错事务不会回滚

@Transactional(rollbackFor = {Exception.class})
public void insertData() throws Exception {
    // 业务代码1
    business1();
    
    // 业务代码2
    business2();
    
    // 业务代码3
    business3();
}
 
public void business1() {
    // 此处省略业务操作
}
 
public void business2() {
    // 此处省略业务操作
}
 
public void business3() {
    // 此处省略业务操作
}

以上代码在service层执行insertData方法时,business3中的代码执行出错了,business1和business2中的操作都没有回滚

解决方法

方法一:在service方法中捕获异常,同时向外抛出运行时异常

@Transactional(rollbackFor = {Exception.class})
public void insertData() throws Exception {
    try {
        // 业务代码1
        business1();
        
        // 业务代码2
        business2();
        
        // 业务代码3
        business3();
    } catch(Exception e) {
        throw new RuntimeException(e);
    }
}

方法二:在service方法中捕获异常,同时手动回滚事务

service手动回滚问题

如果对spring配置了service层事物的管理。

在一些业务中需要回滚,正常来说抛出一个运行时异常即可

throw new RuntimeException();

只是这样的话代码就结束了,如果要返回给用户错误信息,不太方便,这时可以添加如下代码,在catch中手动回滚

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

这样既能正常返回错误信息,而又保持了事物的原子性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 关于controller的异常处理及service层的事务控制方式

    目录 controller异常处理及service层的事务控制 controller层Exception异常事务回滚失效问题 Spring的@Transactional源码中写道 测试① 测试② 测试③ 测试④ controller异常处理及service层的事务控制 最近写代码涉及到一些事务,上午终于把代码给理顺了,之前不太清楚在哪里做异常处理,导致代码遍地try-catch,相当难看. 还是基于controller-service-dao三层来写代码,从入口开始,controller层的方法

  • springboot多个service互相调用的事务处理方式

    目录 多个service互相调用的事务处理 注解配置如下 Spring事务调用Service和Service之间的调用 原理解析 多个service互相调用的事务处理 今天,想在一个service的方法A中,调用另一个service的方法B,方法A和方法B均存在数据库插入操作,并且@Transaction注解也都加了,但是当B方法中抛出异常时,A中的插入语句还是能够执行成功. 注解配置如下 @Transactional(isolation= Isolation.DEFAULT,propagati

  • 关于MVC的dao层、service层和controller层详解

    目录 MVC的dao层.service层和controller层 1.dao层 2.service层 3.controller层 4.view层 5.它们之间的关系 关于dao层/mapper层的一些笔记 1.BaseMapper 2.@mapper MVC的dao层.service层和controller层 1.dao层 dao层主要做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,dao层的设计首先是设计dao层的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可以

  • 浅谈controller中调用多个service方法的问题

    目录 controller调用多个service方法 controller调用service中方法的一些事物问题 controller调用多个service方法 一般service方法是有事务的,把所有操作封装在一个service方法中是比较安全的. 如果在controller中调用多个service方法,只有查询的情况下是可以这样的. controller调用service中方法的一些事物问题 关于在开发过程中的事务传播的一个问题: controller 调用service中a方法,a方法没有

  • 关于Controller层和Service层的类报错问题及解决方案

    目录 Controller层和Service层的类报错 Controller层和Service层的作用 1.在controller和service里都写那些代码? 2.在整个项目中什么时候加异常?异常怎么处理? Controller层和Service层的类报错 当出现以下这种情况的时候,可以看看pom.xml文件中是否少了jar包. 当我出现这种情况的时候,我去看pom.xml包发现,如不其然我少了一个jar包 这就是我少了的那个jar包(spring-web),把这个加上之后就可以了. <!-

  • spring在service层的方法报错事务不会回滚的解决

    目录 spring在service层方法报错事务不会回滚 解决方法 service手动回滚问题 spring在service层方法报错事务不会回滚 @Transactional(rollbackFor = {Exception.class}) public void insertData() throws Exception {     // 业务代码1     business1();          // 业务代码2     business2();          // 业务代码3  

  • Java replaceAll()方法报错Illegal group reference的解决办法

    前言 replaceAll(regex, replacement)函数,由于第一个参数支持正则表达式,replacement中出现"$",会按照$1$2的分组模式进行匹配. 当编译器发现"$"后跟的不是整数的时候,就会抛出"非法的组引用"的异常. 例如,如下代码会报错: public class Test { public static void main(String[] args) { String str = "123ABC456

  • vue watch内部调用methods方法报错的解决方案

    目录 watch内部调用methods方法报错 例子 错误原因 理解methods,computed,watch的调用时机 1.methods中定义的函数 2.computed中定义的函数 3.watch中定义的方法 watch内部调用methods方法报错 错误例子还原 例子 <script> export default{ data(){ return { data: 1, } }, watch: { data: (newV, oldV) => { this.printf() //

  • vue父组件调用子组件方法报错问题及解决

    目录 vue父组件调用子组件方法报错 vue父组件调用子组件方法及遇到的问题 vue父组件调用子组件方法报错 在父组件定义了一个tab标签页,每一个标签页下面都调用不同的组件, 如下图所示: 子组件中定义的方法: setup() { const getList = () =>{ const date = moment(new Date()).format('YYYY-MM') loading.value = true apiGetPageList({ salaryDate: date, page

  • spring声明式事务 @Transactional 不回滚的多种情况以及解决方案

    目录 一. spring 事务原理 问题一.@Transactional 应该加到什么地方,如果加到Controller会回滚吗? 问题二. @Transactional 注解中用不用加rollbackFor = Exception.class 这个属性值 问题三:事务调用嵌套问题具体结果如下代码: 四.总结 五. 参考链接 本文是基于springboot完成测试测试代码地址如下: https://github.com/Dr-Water/springboot-action/tree/master

  • Spring事务捕获异常后依旧回滚的解决

    目录 前沿 问题阐述 知识点前置条件 问题追踪 总结 前沿 一段生产事故发人深省,在Spring的声明式事务中手动捕获异常,居然判定回滚了,这是什么操作?话不多说直接上代码 @Service public class A {     @Autowired     private B b;     @Autowired     private C c;     @Transactional(propagation = Propagation.REQUIRED, isolation = Isolat

  • jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法

    废话不多说了,直接给大家贴代码了. jQuery(function ($) { // 备份jquery的ajax方法 var _ajax = $.ajax; // 重写ajax方法,先判断登录在执行success函数 $.ajax = function (opt) { var _success = opt && opt.success || function (a, b) { }; var _opt = $.extend(opt, { success: function (data, te

  • 深入dom4j使用selectSingleNode方法报错分析

    我有一段代码,使用dom4j 正则表达式解析gml , 代码如下:List<Element> featureMembers= root.selectNodes("featureMember");发生以下异常:java.lang.NoClassDefFoundError: org/jaxen/JaxenException    at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)    at or

  • SpringBoot在自定义类中调用service层等Spring其他层操作

    背景: 做了一个TCP服务器来接入智能设备,然后需要将设备实时发送的定位等关键信息存储到数据库. 为了考虑将来可能对外提供rest接口,采用将TCP服务器集成到SpringBoot框架,当然,也是为了能最快利用mybatis框架实现数据访问,然后依次解决了如何启动,如何注销等各种问题,然后在TCP服务器消息处理时,需要写数据库,直接调用DAO层,编译报错. 改为调用Service层,编译正常,运行到调用的地方,报空指针异常,跟踪到异常位置,发现service为空,也就是按照之前controlle

随机推荐