Spring事务框架之TransactionDefinition源码解析

 更新时间:2023年08月29日 11:52:25   作者:福  
这篇文章主要为大家介绍了Spring事务框架之TransactionDefinition源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Spring事务的底层原理

  • Spring事务的框架。
  • Spring事务引入机制,主要学习@EnableTransactionManagement的相关内容。
  • Spring事务的控制机制,主要学习@Trasactional相关内容。

先从Spring事务的框架开始。

Spring事务框架中最重要的内容主要包括:

  • 事务管理器TransactionManager。
  • 事务定义TransactionDefinition。
  • 事务状态TransactionStatus。

其中事务管理器是核心,研究事务管理器需要用到TransactionDefinition和TransactionStatus,所以我们先研究这两部分。

TransactionDefinition

顾名思义,TransactionDefinition是用来定义事务属性的。

有两个比较重要的实现类,一个是DefaultTransactionAttribute.

另一个是DefaultTransactionTemplate:

下来看一下TransactionDefinition中定义的几个事务属性:

事务传播机制,7个事务传播机制的具体含义,我们在其他文章中已经分析过了:

int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;

隔离级别

数据库隔离级别:

//数据库的默认隔离级别
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2; 
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;

默认超时

int TIMEOUT_DEFAULT = -1;

然后,有一个获取默认事务定义的方法(用意待考):

static TransactionDefinition withDefaults() {
     return StaticTransactionDefinition.INSTANCE;
 }

DefaultTransactionAttribute

其中比较重要的一个方式是rollbackOn:

public boolean rollbackOn(Throwable ex) {
     return (ex instanceof RuntimeException || ex instanceof Error);
 }

我们先来看看JavaDoc:

The default behavior is as with EJB: rollback on unchecked exception (RuntimeException), assuming an unexpected outcome outside of any business rules. Additionally, we also attempt to rollback on Error which is clearly an unexpected outcome as well. By contrast, a checked exception is considered a business exception and therefore a regular expected outcome of the transactional business method, i.e. a kind of alternative return value which still allows for regular completion of resource operations.
This is largely consistent with TransactionTemplate's default behavior, except that TransactionTemplate also rolls back on undeclared checked exceptions (a corner case). For declarative transactions, we expect checked exceptions to be intentionally declared as business exceptions, leading to a commit by default.

 默认行为与EJB相同:发生运行时异常或发生Error时回滚。而对于check exception一般会被认为是一个业务可以认可或期望的结果,因此是允许交易完成的。这个默认行为与TransactionTemplate的默认行为是保持一致的。

大概的意思是说:默认情况下发生运行时异常或Error的时候事务回滚。而这个默认行为就是通过这个rollbackOn方法来保证的:

public boolean rollbackOn(Throwable ex) {
        return (ex instanceof RuntimeException || ex instanceof Error);
    }

Spring事务控制中的事务定义的最终落地实现就是这个TransactionAttribute,不过他是通过TransactionAttributeSource持有的,后续分析Spring事务启用机制@EnalbeTransactionManagment的时候会看到。

TransactionDefinition的研究就到这里,下一篇文章研究TransactionStatus。

以上就是Spring事务框架之TransactionDefinition源码解析的详细内容,更多关于Spring事务TransactionDefinition的资料请关注脚本之家其它相关文章!

相关文章

  • mybatis使用foreach语句实现IN查询(三种)

    mybatis使用foreach语句实现IN查询(三种)

    这篇文章主要介绍了mybatis使用foreach语句实现IN查询(三种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java 高并发一:前言

    Java 高并发一:前言

    本系列基于炼数成金课程,为了更好的学习,做了系列的记录。 本文主要介绍 1.高并发的概念,为以后系列知识做铺垫。 2.两个重要的定理
    2016-09-09
  • Java三种IO模型原理实例详解

    Java三种IO模型原理实例详解

    这篇文章主要介绍了Java三种IO模型原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java中的SPI机制案例分享

    Java中的SPI机制案例分享

    这篇文章主要介绍了Java中的SPI机制案例分享,文章基于Java的相关资料展开SPI的详细介绍,SPI的全称是Service Provider Interface,服务提供者接口,下文更多相关内容介绍需要的小伙伴可以参考一下
    2022-04-04
  • java使用异或实现变量互换和异或加密解密示例

    java使用异或实现变量互换和异或加密解密示例

    这篇文章主要介绍了使用异或实现变量互换和异或加密解密示例,需要的朋友可以参考下
    2014-02-02
  • Myeclipse清理项目缓存的几大方法

    Myeclipse清理项目缓存的几大方法

    今天小编就为大家分享一篇关于Myeclipse清理项目缓存的几大方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java实现分页查询功能

    Java实现分页查询功能

    这篇文章主要为大家详细介绍了Java实现分页查询功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 若依框架多数据源切换方式

    若依框架多数据源切换方式

    这篇文章主要介绍了若依框架多数据源切换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java  Vector和ArrayList的分析及比较

    java Vector和ArrayList的分析及比较

    这篇文章主要介绍了java Vector和ArrayList的分析及比较的相关资料,Vector是多线程安全的,而ArrayList不是,本文主要做对比对这两个方法,需要的朋友可以参考下
    2016-11-11
  • java 动态生成SQL的实例讲解

    java 动态生成SQL的实例讲解

    下面小编就为大家带来一篇java 动态生成SQL的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论