# 《Spring核心技术》第35章:深度解析Spring底层事务传播机制源码

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-29 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~


  • 本章难度:★★★★☆

  • 本章重点:从源码级别彻底掌握Spring中的七种事务传播机制。


本章目录如下所示:

  • 学习指引
  • 源码解析
  • 总结
  • 思考
  • VIP服务

# 一、学习指引

Spring事务用了那么久,你了解过Spring事务传播机制对应的源码吗?

通过对Spring声明式事务篇章的学习,已经知道Spring中提供了七种事务的传播机制,那Spring在源码层面是如何处理这七种传播机制的呢?今天,就一起简单聊聊Spring事务传播机制对应的源码。

# 二、源码解析

一起来看看Spring七种事务传播类型对应的源码吧!

Spring中提供了七种事务传播类型,来支持Spring的事务传播机制,本节,就简单聊聊Spring中七种事务传播类型和其对应的源码。

# 2.1 REQUIRED事务传播类型

1.类型描述

REQUIRED事务传播类型表示如果当前没有事务,就新创建一个事务;如果已经存在一个事务,就加入这个事务,这是最常见的事务传播类型,也是Spring当中默认的事务传播类型。

这里,需要重点注意的是:外部不存在事务时,开启新的事务;外部存在事务时,加入到外部事务中。并且如果调用端发生异常,则调用端和被调用端的事务都将会回滚。在这种事务传播类型下,当前操作必须在一个事务中执行。

REQUIRED事务传播类型在Propagation枚举类中的源码如下所示。

REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)
1

基本用法如下代码片段所示。

@Transactional(propagation=Propagation.REQUIRED)
1

2.对应源码

(1)如果当前没有事务,就新创建一个事务

源码详见:org.springframework.transaction.support.AbstractPlatformTransactionManager#getTransaction(@Nullable TransactionDefinition definition)。

else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||
         def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
         def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
    SuspendedResourcesHolder suspendedResources = suspend(null);
    if (debugEnabled) {
        logger.debug("Creating new transaction with name [" + def.getName() + "]: " + def);
    }
    try {
        return startTransaction(def, transaction, debugEnabled, suspendedResources);
    }
    catch (RuntimeException | Error ex) {
        resume(null, suspendedResources);
        throw ex;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

startTransaction()方法源码详见:org.springframework.transaction.support.AbstractPlatformTransactionManager#startTransaction(TransactionDefinition definition, Object transaction, boolean debugEnabled, @Nullable SuspendedResourcesHolder suspendedResources)。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码