前言

本文主要回答一个问题,spring 如何处理事务的隔离级别

事务传播级别

事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题。

传播级别定义的是事务的控制范围

org.springframework.transaction.annotation.Propagation

其中嵌套事务单独写篇博客叙述

源码分析

在 spring 事务源码(二)一文中已经提到了一个关键的方法

org.springframework.transaction.support.AbstractPlatformTransactionManager#getTransaction

是根据当前方法注解@Transactional去创建不同的事务

public final TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException {// 获取事务管理信息Object transaction = doGetTransaction();if (definition == null) {// Use defaults if no transaction definition given.definition = new DefaultTransactionDefinition();}if (isExistingTransaction(transaction)) {// 如果当前线程上下文已经存在事务,则根据事务注解的隔离级别处理return handleExistingTransaction(definition, transaction, debugEnabled);}// 如果当前线程上下文中没有事务,也是根据事务注解的隔离级别处理// 如果当前事务隔离级别是 PROPAGATION_MANDATORYif (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {throw new IllegalTransactionStateException("No existing transaction found for transaction marked with propagation 'mandatory'");}else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {SuspendedResourcesHolder suspendedResources = suspend(null);try {boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);// 创建事务 TransactionStatusDefaultTransactionStatus status = newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);// 开启事务,提交sqldoBegin(transaction, definition);// TransactionSynchronizationManager 相关属性处理// 当前线程上下文事务属性初始化prepareSynchronization(status, definition);return status;}.....}else {//SUPPORTS、NOT_SUPPORTED// 创建空事务,没有实际的事务处理但是也是创建 TransactionStatusif (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT && logger.isWarnEnabled()) {logger.warn("Custom isolation level specified but no actual transaction initiated; " +"isolation level will effectively be ignored: " + definition);}boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);return prepareTransactionStatus(definition, null, true, newSynchronization, debugEnabled, null);}
}

其中在 handleExistingTransaction 方法中有对当前已经存在事务的不同传播级别不同的处理方式

private TransactionStatus handleExistingTransaction(TransactionDefinition definition, Object transaction, boolean debugEnabled)throws TransactionException {// PROPAGATION_NEVERif (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NEVER) {throw new IllegalTransactionStateException("Existing transaction found for transaction marked with propagation 'never'");}//PROPAGATION_NOT_SUPPORTEDif (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) {Object suspendedResources = suspend(transaction);boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);return prepareTransactionStatus(definition, null, false, newSynchronization, debugEnabled, suspendedResources);}//PROPAGATION_REQUIRES_NEWif (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {SuspendedResourcesHolder suspendedResources = suspend(transaction);try {boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);DefaultTransactionStatus status = newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);doBegin(transaction, definition);prepareSynchronization(status, definition);return status;}catch (RuntimeException | Error beginEx) {...}}// PROPAGATION_NESTEDif (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {if (useSavepointForNestedTransaction()) {// 创建一个保存点DefaultTransactionStatus status =prepareTransactionStatus(definition, transaction, false, false, debugEnabled, null);status.createAndHoldSavepoint();return status;}else {// boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);DefaultTransactionStatus status = newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null);doBegin(transaction, definition);prepareSynchronization(status, definition);return status;}}.....boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);return prepareTransactionStatus(definition, transaction, false, newSynchronization, debugEnabled, null);
}

当然上面这些源码看起来还是很懵逼的,需要在结合事务注解切面代码

最后

后面的博客我会着重挑几个常用的传播级别进行详细分析

spring 事务源码分析(四)传播机制总览相关推荐

  1. Spring源码分析-Spring事务源码分析

    导语      在配置Spring事务管理的时候会用到一个类TransactionInterceptor,从下面的类关系图中可以看到TransactionInterceptor继承了MethodInt ...

  2. Spring事务源码分析责任链事务链事务不生效

    文章目录 前言 带着问题分析源码 事务源码分析 寻找Spring事务源码类 TransactionInterceptor调用栈 分析Spring AOP责任链 分析TransactionInterce ...

  3. spring boot 源码分析(七) 事件机制 之 SpringApplicationEvent

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 前面的文章我们讲解了一下spring boot配置文件加载的相关源码分析,下面我们将从源码角度讲解一下spring  ...

  4. Spring Security源码分析四:Spring Social实现微信社交登录

    2019独角兽企业重金招聘Python工程师标准>>> 社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯 ...

  5. Spring事务源码分析

    首先看例子,这例子摘抄自开涛的跟我学spring3. @Test public void testPlatformTransactionManager() { DefaultTransactionDe ...

  6. spring事务源码分析结合mybatis源码(二)

    让我们继续上篇,分析下如果有第二个调用进入的过程. 代码部分主要是下面这个: if (isExistingTransaction(transaction)) {return handleExistin ...

  7. Spring 源码分析(四) ——MVC(二)概述

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) from:Spring 源码分析(四) --MVC(二)概述 - 水门-kay的个人页面 - OSCHINA ...

  8. Spring Cloud源码分析(二)Ribbon(续)

    因文章长度限制,故分为两篇.上一篇:<Spring Cloud源码分析(二)Ribbon> 负载均衡策略 通过上一篇对Ribbon的源码解读,我们已经对Ribbon实现的负载均衡器以及其中 ...

  9. springboot 事务_原创002 | 搭上SpringBoot事务源码分析专车

    前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往Spring Boot事务源码分析的专车 专车问题 为什么 ...

  10. springboot事务回滚源码_002 | 搭上SpringBoot事务源码分析专车

    发车啦,发车啦,上车要求: 点击左上方的"java进阶架构师"进入页面 选择右上角的"置顶公众号"上车 专车介绍 该趟专车是开往Spring Boot事务源码分 ...

最新文章

  1. 实现搜索框记录搜索历史_三个案例告诉你:“搜索框”该如何设计?
  2. 第十三届全国大学生智能汽车竞赛 裁判系统使用说明
  3. 自己对多线程的一点思考
  4. 解决dubbo-admin管控台不能显示服务的问题
  5. mfc程序转化为qt_以“企鹅电竞小程序”改版为例,讲解如何将用户核心路径转化为设计语言...
  6. servlet加载资源两种方式-内外(初始化参数).properties文件
  7. Leetcode--2. 两数相加
  8. 如何用计算机计算胸围,文胸尺码计算器
  9. 怎么用计算机算成250,万能计算器
  10. Maven入门详解与安装配置
  11. java判断优先级代码,Java如何查看线程的优先级?
  12. django解决NameError: name ‘_mysql‘ is not defined 或 mysqlclient 1.4.0 or newer is required报错
  13. 开源文化依旧熠熠生辉 —— 在openEuler社区,有技术、有idea,你就是主角
  14. 投票应用是用mysql还是redis_签到功能,用 MySQL 还是 Redis?
  15. 图像处理一:形态学膨胀和腐蚀
  16. 日撸 Java 三百行(71-80天,BP 神经网络)
  17. Cadence学习之路(八)画PCB前你必须知道的事情!
  18. 华为6108v9刷机U盘的注意事项
  19. 【Excel 教程系列第 15 篇】Excel 中的简单排序(升序 / 降序)、多条件排序、按颜色排序、自定义排序、以及巧用“升序“制作工资条
  20. Real-Time Rendering——9.9.4 Rough-Surface Subsurface Models粗糙表面地下模型

热门文章

  1. 问答列表html,HTML这个样子的图文列表怎么写
  2. rhel6mysql管理_RHEL 6平台MySQL数据库服务器的安装方法
  3. 易筋SpringBoot 2.1 | 第廿一篇:SpringBoot的Mybatis生成工具Generator
  4. 2021-09-1364. 最小路径和
  5. 剑指offerJZ1 二维数组中的查找 C++ python
  6. MIMO-OTFS in High-Doppler Fading Channels:Signal Detection and Channel Estimation(5)
  7. 多个计算机之间触发事件,相互通信的一种方法----通过文件的办法
  8. 浪潮信息能制造超级计算机吗,浪潮信息为中国航天探索事业出力 高性能计算技术领衔...
  9. pc 页面在移动端怎么获取放大倍数、_逆冬:移动端排名应该怎么做?两种匹配移动端实战排名干货分享!...
  10. 全图中第K小路径/团问题(有向/无向)