Spring 事务管理 事务的传播级别

原创 2018年04月16日 17:35:13

例子:对于默认的传播级别 REQUIRED 的测试

首先对于 REQUIRED 的解释如下: 默认事务类型,如果没有,就新建一个事务;如果有,就加入当前事务,也就是大家都使用同一个事务模型,只要有一个发生了异常,那么整个事务都会回滚。

其中对于发生异常导致事务回滚需要注重理解,否则对于REQUIRES_NEW 就会认为某些行为与预先的不一样。

下面针对 REQUIRES_NEW  的测试如下:

@Service
public class A {

    @Resource
    private PersonMapper personMapper;

    @Resource
    private B b;


    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void save() {
        personMapper.insert(Person.builder().name("A").age(12).build());
        b.save();
    }
}
@Service
public class B {

    @Resource
    private PersonMapper personMapper;


    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void save() {
        personMapper.insert(Person.builder().name("B").age(12).build());
        throw new RuntimeException();
    }
}

    @GetMapping(value = "/get2")
    public Object get2() {
        a.save();
        return "success";
    }

由于最开始对于异常回滚理解错误,认为在调用A的save()方法时,创建一个事务,这时再在 调用 b的save() 由于传播级别是创建新的事务,所以B抛出异常,应该仅仅会导致B的保存失败,但是实际测试却发现,A,B的保存都失败了,经过仔细的思考,认为,事务重新创建应该是没有问题的,可能是对于异常回滚的理解错误导致的。

于是修改了A 如下:

@Service
public class A {

    @Resource
    private PersonMapper personMapper;

    @Resource
    private B b;


    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void save() {
        personMapper.insert(Person.builder().name("A").age(12).build());
        try{
            b.save();
        }catch (Exception e){

        }
    }
}

经过测试,发现此时就是 B保存失败而A保存成功了,经过测试推论如下:

在A对象中没有追加try catch的时候,当B 抛出异常的时候,B的事务回滚,但是由于并没有对该异常进行处理,于是该异常扩散到了A中的调用点(b.save();)由于此处的异常,因而导致A回滚了,当追加 try catch 之后 此异常就不会导致A回滚了。


为了验证此猜想,编写如下测试用例:

@Service
public class A {

    @Resource
    private PersonMapper personMapper;

    @Resource
    private B b;


    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void save() {
        personMapper.insert(Person.builder().name("A").age(12).build());
        try{
            b.save();
        }catch (Exception e){

        }
    }
}
@Service
public class B {

    @Resource
    private PersonMapper personMapper;


    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public void save() {
        personMapper.insert(Person.builder().name("B").age(12).build());
        throw new RuntimeException();
    }
}
在进行测试,就发现事务回滚了,表明B中的异常导致了整个事务的回滚。

下面继续测试嵌套事务 NESTED :嵌套事务 类似于后一个事务为第一个事务的子事务

经过测试规则如下:父事务回滚,子事务一定回滚,但是子事务回滚,不影响父事务回滚。

   PROPAGATION_SUPPORTS:如果没有,就以非事务方式执行;如果有,就使用当前事务。


以下的事务就比较容易理解了:


    PROPAGATION_NOT_SUPPORTED:如果没有,就以非事务方式执行;如果有,就将当前事务挂起。即无论如何不支持事务。

    PROPAGATION_NEVER:如果没有,就以非事务方式执行;如果有,就抛出异常。

    PROPAGATION_MANDATORY:如果没有,就抛出异常;如果有,就使用当前事务。









Spring事务的7个传播行为,4个隔离级别

Spring事务的传播行为和隔离级别[transaction behavior and isolated level] Spring中事务的定义:  一、Propagation  k...
  • flqljh
  • flqljh
  • 2015-11-14 10:29:54
  • 4252

spring事务传播特性和事务隔离级别

一、事务传播特性 转自:http://www.iteye.com/topic/35907 在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看...
  • jjavaboy
  • jjavaboy
  • 2015-04-24 10:49:32
  • 6047

spring aop事务传播方式和隔离级别

一. 传播:        如果两个在代码上不相关的操作,需要放在同一个事务中,这就需要利用到传播特性了。这时调用的传播特性的值就应该是PROPAGATION_REQUIRED。在spring中只需...
  • daiqinge
  • daiqinge
  • 2016-04-18 14:08:32
  • 2788

spring事务(Transaction)的七种事务传播行为及五种隔离级别

spring事务(Transaction)的七种事务传播行为及五种隔离级别
  • baidu_37107022
  • baidu_37107022
  • 2017-07-20 21:25:11
  • 1313

spring的事务传播行为、隔离级别和事务的一些基本概念

事务ACID: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。ISOLATION_DEFAULT:使用数据库默认的...
  • paincupid
  • paincupid
  • 2015-09-02 16:25:47
  • 1857

Spring4深入理解----事务(声明式事务和xml配置事务,事务传播属性,事务其他属性(隔离级别&回滚&只读&过期))

参考代码下载github:https://github.com/changwensir/java-ee/tree/master/spring4   •事务管理是企业级应用程序开发中必不可少的技术...
  • oChangWen
  • oChangWen
  • 2016-09-17 13:39:45
  • 3881

spring的事务管理,事务隔离级别(代码级别)

Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Sprin...
  • cs_fei
  • cs_fei
  • 2013-08-04 17:52:21
  • 1183

Spring学习笔记 事务管理

事务简介所谓事务,指的是程序中可运行的不可分割的最小单位。在生活中事务也是随处可见的。比方说你在Steam上剁手买了一款游戏,那么付款就是一个事务,要么付款成功,游戏到手;要么付款失败,钱退回你账户。...
  • u011054333
  • u011054333
  • 2017-01-31 20:48:56
  • 453

Spring事务配置及事务的传播性与隔离级别详解

Spring事务配置 通过注解配置 1.在Spring配置文件引入
  • v123411739
  • v123411739
  • 2016-03-10 15:37:05
  • 4332

spring 事务传播行为和事务隔离级别

1、Spring声明式事务 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一。 Spring的声明式事务顾...
  • yujin753
  • yujin753
  • 2014-12-29 20:30:56
  • 3015
收藏助手
不良信息举报
您举报文章:Spring 事务管理 事务的传播级别
举报原因:
原因补充:

(最多只允许输入30个字)