关于事务的传播,我们先确定一个场景:方法A调用方法B,方法A可能存在事务,也可能不存在事务,我们这里重点关注方法B上定义的事务传播行为,以及方法B中出现异常时,方法A应该如何处理事务的提交或回滚(如果存在)。



    @Autowired private ServiceB serviceB;

    public void methodA() {
// do anything
serviceB.mehtodB();
// do anything
} @Transactional(propagation = Propagation.NESTED)
public void mehtodB() {
// do anything
}

事务的传播行为类型

1 .PROPAGATION_REQUIRED(默认实现)

方法B的执行需要有事务,如果方法A有事务,那么方法B加入方法A的事务,方法A或B的异常都会导致整个事务回滚。

2 .PROPAGATION_SUPPORTS

方法B的执行支持事务,如果方法A存在事务,那么方法B加入方法A的事务,否则方法B以无事务的方式执行。此情景下,A方法事务回滚也将导致方法B回滚,方法A无事务则不影响。

3 .PROPAGATION_MANDATORY

方法B强制必须在事务条件下执行,方法B加入方法A的事务执行,如果方法A无事务,则抛出异常。

4 .PROPAGATION_REQUIRES_NEW

方法B必须在新事务中执行,如果A存在事务,那么把方法A的事务挂起;此种情境下,方法A和方法B的回滚不会影响到对方。

5 .PROPAGATION_NOT_SUPPORIED

方法B必须在无事务条件下执行,如果方法A存在事务,那么需要将方法A的事务挂起。

6 .PROPAGATION_NEVER

方法B必须在不存在事务的条件下执行,如果方法A存在事务,则抛出异常。

7 .PROPAGATION_NESTED

这里我们需要了解下嵌套事务的提交

  • 我们把嵌套事务视作一棵树,根节点事务叫做顶层的事务,其它事务是顶层事务的子事务;
  • 任何嵌套的子事务的提交和回滚,都必须在它的父事务提交后进行;嵌套的子事务可以独立于当前事务进行单独地提交或回滚;
  • 任何父事务的回滚都会导致它的所有子事务的回滚。

嵌套事务,如果方法A存在事务,那么方法B的创建一个方法A事务的嵌套事务(从数据库的层面看,也可视为子事务),如果方法A不存在事务,那么行为与PROPAGATION_REQUIRED相同。

此处,父事务的回滚行为会导致子事务回滚;而子事务的回滚和提交独立于父事务。

注意事项

  • 非public 方法会导致事务失效

  • 事务默认的异常类型是: RuntimeException

spring事务的传播的更多相关文章

  1. Spring事务的传播行为 @Transactional(转)

    Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...

  2. Spring事务的传播行为 @Transactional

    Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...

  3. Spring事务的传播特性和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

  4. Spring事务的传播行为

      本文主要介绍下Spring事务中的传播行为. 事务传播行为介绍 Spring中的7个事务传播行为: |事务行为|说明 | |:--|:--| |PROPAGATION_REQUIRED | 支持当 ...

  5. Spring事务的传播:PROPAGATION_REQUIRED

    PROPAGATION_REQUIRED-- 支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. ServiceA { void methodA() { ServiceB.method ...

  6. Spring事务的传播行为分析

    前言 最近项目有涉及到Spring事务,所以工作之余,想认真了解学习下Spring事务,查阅了若干资料,做了一个demo(PS:参考了大牛的). 现分享总结如下: 1.Spring 事务的简介 理解事 ...

  7. 关于事务,事务的特性,spring事务的传播特性

    1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...

  8. 数据库的特性与隔离级别和spring事务的传播机制和隔离级别

    首先数据库的特性就是 ACID: Atomicity 原子性:所有事务是一个整体,要么全部成功,要么失败 Consistency 一致性:在事务开始和结束前,要保持一致性状态 Isolation 隔离 ...

  9. Spring事务管理-传播行为-隔离级别

    事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败. 事务的特性:ACID 原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 一致性:事务前后数据的完整性约束保持一致 ...

  10. Spring事务之传播机制

    Spring事务传播机制:Spring在TransactionDefinition接口中规定了种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套时事务如何进行传播.即协调已经有事务标识的方法之 ...

随机推荐

  1. [转帖]15分钟了解TiDB

    https://zhuanlan.zhihu.com/p/338947811 由于目前的项目把mysql换成了TiDb,所以特意来了解下tidb.其实也不能说换,由于tidb和mysql几乎完全兼容, ...

  2. [转帖]在KingbaseES数据库中批量创建数据库/表

    1. 问题 如何在KingbaseES中批量创建表和库? 2. 通过shell脚本文件实现 有时候我们在进行测试的时候需要进行批量的建库以及建表,这时我们可以使用shell脚本实现或者是SQL实现,s ...

  3. [转帖]Elasticsearch部署配置建议

    1: 选择合理的硬件配置:尽可能使用 SSD Elasticsearch 最大的瓶颈往往是磁盘读写性能,尤其是随机读取性能.使用SSD(PCI-E接口SSD卡/SATA接口SSD盘)通常比机械硬盘(S ...

  4. [转帖]dd命令中dsync和fsync区别

    在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及几个常用参数:sync.dsync.fsync与fdatasync # dd if=/dev/zero of=/tmp/1G bs= ...

  5. [专题]中立遭质疑,提价遭反对,ARM的生存难题怎么破?

    中立遭质疑,提价遭反对,ARM的生存难题怎么破? https://news.cnblogs.com/n/669715/ ARM税要提高.. RISC-V的机会? 文/黎文婕 来源:锌刻度(ID:znk ...

  6. 京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队

    ​ 1 前言 在<ElasticSearch降本增效常见的方法>一文中曾提到过zstd压缩算法[1],一步一个脚印我们终于在京东ES上线支持了zstd:我觉得促使目标完成主要以下几点原因: ...

  7. 一文详解 Netty 组件

    作者:京东物流 张弓言 一.背景 Netty 是一款优秀的高性能网络框架,内部通过 NIO 的方式来处理网络请求,在高负载下也能可靠和高效地处理 I/O 操作 作为较底层的网络通信框架,其被广泛应用在 ...

  8. VictoriaMetrics 1.80版本中值得关注的新特性

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 change log请看:https://github.c ...

  9. 【小测试】rust中的数组越界——好吧,这下证明rust不是零成本抽象了吧

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 1.编译期发现的数组越界 在数组下标是常量的情况下,编译期 ...

  10. vue基础系列文章12---创建脚手架

    一.交互式命令行创建 1.运行 vue create myvue 选择默认创建模式,会在指定的文件夹下创建文件 2.进入到myvue文件夹,运行:npm  run serve 3.访问本地的地址就可以 ...