美文网首页
Spring事务问题

Spring事务问题

作者: Tomy_Jx_Li | 来源:发表于2019-01-02 17:04 被阅读5次

问题:Spring中存在类A和类B,A中存在方法methodA。B中存在方法methodB1和methodB2。methodB1上不存在Transactional事务管理,也就是没有注解@Transactional。methodB2上存在注解@Transactional。那么方法A调用methodB1,methodB1又调用methodB2。这时如果methodB2抛出异常了。那么事务会回滚吗???

问题复现,代码如下

StudentCtrl

package com.jiyx.test.testspringbootmybatis.ctrl;

import com.jiyx.test.testspringbootmybatis.entity.Student;
import com.jiyx.test.testspringbootmybatis.service.StudentSV;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * auther: jiyx
 * date: 2018-12-26.
 */
@RestController
@RequestMapping("/student")
public class SutdentCtrl {

    @Autowired
    private StudentSV studentSV;

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    @GetMapping("/findAll")
    public List<Student> findALl() {
        return studentSV.findAll();
    }

    @PostMapping("/add")
    public void insert(@RequestBody Student student) {
        studentSV.insert(student);
    }
}

StudentSV

package com.jiyx.test.testspringbootmybatis.service;


import com.jiyx.test.testspringbootmybatis.entity.Student;

import java.util.List;

/**
 * auther: jiyx
 * date: 2018-12-26.
 */
public interface StudentSV {

    List<Student> findAll();

    void insert(Student student);

    void insert1(Student student);
}

StudentSVImpl是StudentSV的实现类

package com.jiyx.test.testspringbootmybatis.service.impl;

import com.jiyx.test.testspringbootmybatis.entity.Student;
import com.jiyx.test.testspringbootmybatis.mapper.StudentExample;
import com.jiyx.test.testspringbootmybatis.mapper.StudentMapper;
import com.jiyx.test.testspringbootmybatis.service.StudentSV;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * auther: jiyx
 * date: 2018-12-26.
 */
@Service("studentSV")
public class StudentSVImpl implements StudentSV {

    @Autowired
    private StudentMapper studentMapper;

    @Override
    public List<Student> findAll() {
        return studentMapper.selectByExample(new StudentExample());
    }

    @Override
//    @Transactional(rollbackFor = RuntimeException.class)
    public void insert(Student student) {
        this.insert1(student);
    }

    @Override
    @Transactional(rollbackFor = RuntimeException.class)
    public void insert1(Student student) {
        studentMapper.insert(student);
        throw new RuntimeException("回滚吗?");
    }
    
}

结论:

经测试,方法调用链是A->B1->B2的时候,是不能够产生管理事务的,所以就算抛出异常也不能回滚。

原因:

因为spring的事务调用是基于AOP的,而同一个类中的方法调用是不会走aop的。具体原因可以查看源码。推荐一个博客吧

解决方法:

方式一:在B1上直接加上注解@Transactional
方式二:在启动类上,加上配置@EnableAspectJAutoProxy(exposeProxy = true),然后再B1中使用(StudentSV)AopContext.currentProxy()进行调用。
方式二如图:


启动类注解配置
B1修改

相关文章

  • Spring事务配置&&回滚失效的原因之一

    包名的配置问题 Spring 事务的隔离性 Spring事务的传播行为 事务配置 applicationConte...

  • Spring事务问题

    问题:Spring中存在类A和类B,A中存在方法methodA。B中存在方法methodB1和methodB2。m...

  • spring事务问题

    springmvc中在service层中有如下逻辑:1.提交事务2.开启新线程,新线程中的业务依赖1中提交的事务处...

  • spring 声明式事务管理

    本节阐述在事务相关的问题上,Spring框架的声明式事务管理的内部工作原理。 关于Spring框架的声明式事务支持...

  • 关于事务的思考

    Spring对于事务的支持 Spring事务接口 Spring事务管理器 Spring并不直接管理事务,而是提供多...

  • Spring事务不生效问题

    事务未生效可能造成严重的数据不一致性问题,因而保证事务生效至关重要。Spring事务是通过Spring aop实现...

  • JAVA高级工程师-面试题

    一:大框架方面问题 1、Spring 事务的隔离性,并说说每个隔离性的区别 解答:Spring事务详解 2、Spr...

  • Spring事务

    Spring 事务 分类 Spring可以支持编程式事务和声明式事务。 编程式事务 实现 Spring使用事务管理...

  • spring事务内部调用问题

    spring事务内部调用问题: 解决类似的问题有以下几种办法:

  • JAVA-每日一面 2022-01-19

    Spring 事务底层原理 a、划分处理单元——IOC 由于 spring 解决的问题是对单个数据库进行局部事务处...

网友评论

      本文标题:Spring事务问题

      本文链接:https://www.haomeiwen.com/subject/nqazlqtx.html