Spring中propagation的传播机制详解

 更新时间:2023年12月15日 10:29:23   作者:涝山道士  
这篇文章主要介绍了Spring中propagation的传播机制详解,要搞懂事务的传播机制,那么就要明白逻辑事务中各个事务的关系,才能彻底理解事务传播特性,在Spring事务中,各个逻辑事务的关系可以是并列、覆盖或包含,需要的朋友可以参考下

事务传播机制-propagation

要搞懂事务的传播机制,那么就要明白逻辑事务中各个事务的关系,才能彻底理解事务传播特性。

物理事务与逻辑事务

事务性资源实际打开的事务就是物理事务,如数据库事务。

而Spring会为每个@Transactional注解的方法创建一个事务范围,这种事务无法影响数据库事务的实现,因此可以理解为逻辑事务。

在Spring事务中,各个逻辑事务的关系可以是并列、覆盖或包含。

对于并排:并发情况下,多个线程相互执行自己的事务,互不影响(单指事务异常回滚,不涉及事务隔离)。 . 对于覆盖:是指层层嵌套的方法共用同一个事务,事务的属性由最外围方法的属性值决定。这些方法要么同时执行成功要么同时回滚。 . 对于包含:大范围的事务称为外围事务,小范围的事务称为内部事务,外围事务可以包含内部事务。他们在逻辑上是互相独立的。每个内部事务,都能独立设置如read-only等属性,而不影响外围事务。

如何处理逻辑事务内部以及与物理事务之间的关联关系,就是传播特性解决的问题。

事务的传播类型

REQUIRED

Spring默认的事务传播机制。支持当前事务;如果不存在事务,则创建一个新的事务。

参与到一个已存在的更大范围的外围事务中,如果没有外围事务,就打开一个新事务用于当前范围。在相同的线程中,这是一种很好的事务安排方式。

注:一个参与到外围事务的事务,会使用外围事务的特性,安静地忽略掉自己的隔离级别,超时值,只读标识等设置。

当然可以在事务管理器上设置validateExistingTransactions标识为true,这样当你自己的事务和参与到的外围事务设置不一样时会被拒绝。

REQUIRES_NEW

创建一个新事务,如果当前存在事务,则暂停当前事务。

与REQUIRED相比,总是使用一个独立的事务用于当前的逻辑事务,从来不参与到一个已存在的外围事务范围。

这样安排的话,底层的事务资源是不同的,因此,可以独立地提交或回滚。外围事务不会被内部事务的回滚状态影响。

这样一个独立的内部事务可以声明自己的隔离级别,超时时间和只读设置,并不继承外围事务的特性,也不会被外围事务覆盖。

与NOT_SUPPORTED类似,我们需要JTATransactionManager来实现实际的事务暂停。

MANDATORY(强制的)

仅支持当前事务;如果当前事务不存在,则抛出异常。

NESTED(嵌套)

如果存在当前事务,则在该事务种嵌套执行。同时将在这段逻辑事务开始处标记一个保存点,当这个逻辑事务抛出异常回滚时,那么事务将跳转到保存点,从而不影响嵌套事务的外部。 当前事务不存在时,同REQUIRED。

当事务存在时,使用同一个事务,该事务可能会带有多个保存点,回滚到这些保存点从而不会影响整个事务。可以认为是部分回滚,这样一个内部事务范围触发了一个回滚,外围事务能够继续这个物理事务,尽管有一些操作已经被回滚。

DataSourceTransactionManager支持这种开箱即用的传播。

JTATransactionManager的一些实现也可能支持这一点。不过JpaTransactionManager仅支持JDBC连接的NESTED, 如果我们将nestedTransactionAllowed标志设置为true,且JDBC驱动程序支持保存点,它也适用于JPA事务中的JDBC访问代码。

NEVER

非事务执行,如果存在事务,则抛出异常。

SUPPORTS

支持当前事务,如果不存在则以非事务方式执行。

NOT_SUPPORTED

以非事务方式执行,如果当前事务存在,则挂起当前事务。

JTATransactionManager开箱即用地支持真正的事务暂停。其他人通过持有对现有的引用然后从线程上下文中清除它来模拟暂停

TIMEOUT_DEFAULT

使用默认超时的底层事务系统,或者如果不支持超时则没有。

到此这篇关于Spring中propagation的传播机制详解的文章就介绍到这了,更多相关propagation传播机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java教学笔记之对象的创建与销毁

    java教学笔记之对象的创建与销毁

    面向对象的编程语言使程序能够直观的反应客观世界的本来面目,并且使软件开发人员能够运用人类认识事物所采用的一般思维方法进行软件开发,是当今计算机领域中软件开发和应用的主流技术。
    2016-01-01
  • springboot引入druid解析sql的过程

    springboot引入druid解析sql的过程

    在开发中,有时我们可能会需要获取SQL中的表名,那么因为不同的数据源类型SQL会存在部分差异,那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析,需要的朋友可以参考下
    2023-08-08
  • mybatis源码解读之executor包懒加载功能 

    mybatis源码解读之executor包懒加载功能 

    这篇文章主要介绍了mybatis源码解读之executor包懒加载功能,mybatis的懒加载的实现由executor包的loader子包支持,下面文章详细内容需要的小伙伴可以参考一下
    2022-02-02
  • Java Kafka分区发送及消费实战

    Java Kafka分区发送及消费实战

    本文主要介绍了Kafka分区发送及消费实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 基于springEL表达式详解及应用

    基于springEL表达式详解及应用

    这篇文章主要介绍了springEL表达式详解及应用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot服务器端解决跨域问题

    SpringBoot服务器端解决跨域问题

    这篇文章主要介绍了SpringBoot服务器端解决跨域问题,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-11-11
  • SpringBoot源码 PropertySource解析

    SpringBoot源码 PropertySource解析

    PropertySource是spring中对于键值属性的一种抽象,主要是name和sourcePropertyResolver是对PropertySource提供对外的统一数据处理,对于占位符的处理委托于PropertyPlaceholderHelper,对Springboot 源码 PropertySource相关知识感兴趣的朋友一起看看吧
    2023-01-01
  • 猜你不知道Spring Boot的几种部署方式(小结)

    猜你不知道Spring Boot的几种部署方式(小结)

    这篇文章主要介绍了猜你不知道Spring Boot的几种部署方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Java反射机制(Reflection)浅析

    Java反射机制(Reflection)浅析

    这篇文章主要介绍了Java反射机制(Reflection)浅析,本文以实例讲解Java的反射机制,需要的朋友可以参考下
    2014-07-07
  • Java中join线程操作实例分析

    Java中join线程操作实例分析

    这篇文章主要介绍了Java中join线程操作,结合实例形式分析了java使用join方法操作线程的相关原理与实现技巧,需要的朋友可以参考下
    2019-09-09

最新评论