Spring 事务的传播属性

事务的传播属性:

1.PROPAGATION_REQUIRED * :如果不存在事务则新建事务,若存在事务则加入事务,默认是这个
2.PROPAGATION_SUPPORTS:若当前没有事务,则已非事务执行
3.PROPAGATION_MANDATORY:若当前没有事务则抛出异常
4.PROPAGATION_REQUIRES_NEW:新建事务,若当前存在事务则挂起。
5.PROPAGATION_NOT_SUPPORTED:已非事务执行,若当前存在事务则挂起。
6.PROPAGATION_NEVER:已非事务执行,若当前存在事务则抛出异常
7.PROPAGATION_NESTED:若当前存在事务则在嵌套事务重执行,若不存在则新建事务

Spring事务

在Spring中,事务是通过AOP来实现的,那么一次完整的事务流程大概是这个样子:
其中除业务代码的其他流程,就是事务对于业务代码的增强。

事务的先决条件

若两个DML语句想要使用同一个事务,必须保证关闭自动提交,并且使用同一个数据库连接。

事务的传播

假设有一个购物车结算服务,用户下单后需要写入订单表,清空购物车,库存-1

// 订单服务
@Transactional(propagation=Propagation.REQUIRED)
public void clearShoppingCart(...) {// 清空购物车shoppingCartMapper.clearShoppingCart(...);// 写入订单表orderService.purchase(...);// 减库存stockService.reduce(...);
}// OrderService的写入订单
@Transactional(propagation=Propagation.REQUIRED)
public void purchase(...){...}// stockService的减少库存
@Transactional(propagation=Propagation.REQUIRED)
public void reduce(...){...}

在上面的代码片中,clearShoppingCart事务中又调用了其他两个包含事务的方法,那么在调用时流程图可以理解成(暂不考虑异常):

在代码片中,写入订单以及减少库存的事务属性都是REQUIRED(如果不存在事务则新建事务,若存在事务则加入事务)。所以 “写入订单表开启事务”,“库存减少开启事务” 实际上都是使用的清空购物车的数据库连接。“订单事务提交” 与 “库存减少提交” 可以先理解成什么都没有做。事务的整体提交是由最后的 “清空购物车事务提交” 提交的。

其他事务传播属性

这么一看,其实其他事务属性的大概流程也能推出来,拿REQUIRED_NEW来举例,假设写入订单与减少库存的代码变成如下

// OrderService的写入订单
@Transactional(propagation=Propagation.REQUIRED_NEW)
public void purchase(...){...}// stockService的减少库存
@Transactional(propagation=Propagation.REQUIRED)
public void reduce(...){...}

那么在 “写入订单开始事务” 时,会将清空购物车使用的连接挂起,从数据库连接池中新拿一个连接,执行DML语句后直接提交。而减少库存操作依旧会使用写入订单的数据库连接,并与写入订单操作一起提交。

Spring 事务的传播属性相关推荐

  1. 数据库事务原理详解-Spring 事务的传播属性

    所谓spring 事务的传播属性,就是定义在存在多个事务同时存在的时候,spring 应该如何处理这些事务的行为.这些属性在TransactionDefinition 中定义,具体常量的解释见下表: ...

  2. Spring事务处理,以及Spring事务的传播属性和隔离级别

    本文转自:http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html 事务的隔离级别:事务隔离级别用于处理多事务并发的情况,通常使用 ...

  3. spring事务的传播属性

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 表1事务传播行为类型 事务传播行为类型 说明 ...

  4. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spr ...

  5. 面试官:Spring事务的传播行为有几种?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:程序员入职国企,1周上班5小时,晒出薪资感叹:腾讯当CEO也不去个人原创+1博客:点击前往,查看更多 在Spri ...

  6. spring手动控制事务开启_“上帝视角”图解Spring事务的传播机制原理

    转载:https://mp.weixin.qq.com/s/odP1DKgRtXsCcAKxwGahug 数据库事务的"抓手" 数据库的事务功能已经由数据库自身实现,它留给用户的就 ...

  7. Spring事务的传播行为

    Spring事务的传播行为 Spring事务的传播行为有七种,对应着事务定义接口TransactionDefinition中的七种状态.PROPAGATION_REQUIRED.PROPAGATION ...

  8. Spring事务的传播机制

    spring事务的传播机制 1.spring事务 指封装在数据库事务之上的一种事务处理机制.其管理方法有两种,分别是编程式事务以及声明式事务.一般我们使用@Transactional进行声明式事务. ...

  9. spring事务的传播

    1.spring事务的传播 为什么会有传播机制 spring对事务的控制,是使用aop切面实现的 场景一:A调用B,都有事务,B异常,让B提交还是两个一起回滚 场景二:A调用B,A有事务,是够让B加入 ...

最新文章

  1. 搭建 数字证书_CA认证介绍及搭建过程
  2. javascript怎么监听 form.submit事件
  3. 第4课 - 深入浅出处理器(续)
  4. mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程
  5. 支持所有库的python手机编程-入坑 Python 后强烈推荐的一套工具库
  6. 2dpca的matlab代码,2DPCA人脸识别的matlab代码
  7. java多个收银台收银_Java策略模式设计(简易收银台SpringBoot)
  8. 在电脑前,写点什么...
  9. Django中ORM之创建模型
  10. 性能优化专题 - MySql 性能优化 - 03 - 深入理解InnoDB
  11. 乐高机器人巡线C语言程序,乐高机器人巡线原理
  12. STM32正点原子和野火程序移植
  13. 【开源教程5】疯壳·开源编队无人机-飞控固件烧写
  14. 手机logging什么意思_手机logging怎么关闭
  15. appium通过定位坐标进行定位(兼容模式)
  16. ijk基于exo_github上十二款最著名的Android播放器开源项目
  17. 北京:外地社保卡可以在北京19家医院实现住院费用即时结算!
  18. c语言 运算符op,1 简单计算器。请编写一个程序计算表达式:datal op data2的值。其中op为运算符+、—、*、/。...
  19. linux 造字程序下载,truetype造字程序下载
  20. 03-元素定位-基本

热门文章

  1. Win32汇编练习(SMU—循环结构)
  2. 富爸爸,穷爸爸读后的一些认知
  3. 面试指导——剑指offer
  4. [LBS学习笔记3]redis geo地理位置查询分析
  5. 英语练习90 What's your type
  6. 【网络工程】身为工程师不懂工程类专业知识?小心被人笑话
  7. 圣诞老人python代码_Python秘密圣诞老人程序如何取得更高的成功R
  8. 蘑菇街Java工资_【蘑菇街工资】java开发工程师待遇-看准网
  9. Android修改读写速度,技术宅 篇一:如何让旧安卓手机的速度重新飞一会儿(使用开发者选项)通过改设置加快速度...
  10. mysql的树状表结构设计。