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传播机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android开发简单计算器实现代码

    Android开发简单计算器实现代码

    这篇文章主要介绍了Android开发简单计算器实现,本文放置了完整的Android开发电脑,通过部署项目可以直接按到效果,希望本篇文章可以对你有所帮助
    2021-06-06
  • Spring cloud oauth2如何搭建认证资源中心

    Spring cloud oauth2如何搭建认证资源中心

    这篇文章主要介绍了Spring cloud oauth2如何搭建认证资源中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Spring boot 集成 Druid 数据源过程详解

    Spring boot 集成 Druid 数据源过程详解

    这篇文章主要介绍了Spring boot 集成 Druid 数据源过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • java处理图片背景颜色的方法

    java处理图片背景颜色的方法

    这篇文章主要为大家详细介绍了java处理图片背景颜色的方法,蓝底寸照批量转换为白底,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • springboot微服务项目集成html页面的实现

    springboot微服务项目集成html页面的实现

    本文主要介绍了springboot微服务项目集成html页面的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java设计模式之原型模式的示例详解

    Java设计模式之原型模式的示例详解

    原型模式(Prototype Pattern)指使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。本文将通过案例详细讲解一下原型模式,感兴趣的可以了解一下
    2022-02-02
  • Mybatis配置返回为修改影响条数方式

    Mybatis配置返回为修改影响条数方式

    这篇文章主要介绍了Mybatis配置返回为修改影响条数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot 如何添加容器启动的初始化逻辑的操作方法

    SpringBoot 如何添加容器启动的初始化逻辑的操作方法

    这篇文章主要介绍了SpringBoot 如何添加容器启动的初始化逻辑,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java连接数据库,及增删改查的示例

    Java连接数据库,及增删改查的示例

    这篇文章主要介绍了Java连接数据库,及增删改查的示例,帮助大家更好的利用Java处理数据,感兴趣的朋友可以了解下
    2020-10-10
  • Spring中@Configuration注解和@Component注解的区别详解

    Spring中@Configuration注解和@Component注解的区别详解

    这篇文章主要介绍了Spring中@Configuration注解和@Component注解的区别详解,@Configuration 和 @Component 到底有何区别呢?我先通过如下一个案例,在不分析源码的情况下,小伙伴们先来直观感受一下这两个之间的区别,需要的朋友可以参考下
    2023-09-09

最新评论