Java Spring AOP源码解析之事务实现原理

 更新时间:2022年01月07日 15:06:42   作者:Java识堂  
这篇文章主要为大家介绍了Java Spring AOP事务实现原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

不用Spring管理事务?

让我们先来看一下不用spring管理事务时,各种框架是如何管理事务的

使用JDBC来管理事务

在这里插入图片描述

使用Hibernate来管理事务

在这里插入图片描述

业务逻辑和事务代码是耦合到一块的,并且和框架的具体api绑定了。当我们换一种框架来实现时,里面对事务控制的代码就要推倒重写,并不一定能保证替换后的api和之前的api有相同的行为。

基于这些问题,Spring抽象了一些事务相关的顶层接口,我们面向接口编程,换框架时只要换具体的实现即可。有点像JDBC API的味道了

在这里插入图片描述

常用api接口
PlatformTransactionManager对事务进行管理
TransactionDefinition定义事务的相关属性,例如隔离级别,传播行为
TransactionStatus保存事务状态

针对不同的数据访问技术,使用不用的PlatformTransactionManager类即可

数据访问技术PlatformTransactionManager实现类
JDBC/MybatisDataSourceTransactionManager
HibernateHibernateTransactionManager
JpaJpaTransactionManager
JmsJmsTransactionManager

编程式事务管理

使用PlatformTransactionManager

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

使用TransactionTemplate

当我们直接使用PlatformTransactionManager来管理事务时,有很多模版代码。例如业务代码正常执行,提交事务,否则回滚事务。我们可以把这部分模版代码封装成一个模版类,这样使用起来就很方便了,如下所示

在这里插入图片描述

如下图所示,TransactionTemplate#execute方法就是一个典型的模版方法

在这里插入图片描述

我们可以传入如下2个接口的实现类来执行业务逻辑,TransactionCallback(需要返回执行结果)或TransactionCallbackWithoutResult(不需要返回结果)

声明式事务管理

为了让使用更加简洁,Spring直接把事务代码的执行放到切面中了,我们只需要在业务代码方法上加上一个@Transactional注解即可,这种方式我们最常用哈

使用@Transactional注解

此时事务相关的定义我们就可以通过@Transactional注解来设置了

属性名类型描述默认值
value(和transactionManager互为别名)String当在配置文件中有多个PlatformTransactionManager ,用该属性指定选择哪个事务管理器空字符串""
propagation枚举:Propagation事务的传播行为REQUIRED
isolation枚举:Isolation事务的隔离度DEFAULT
timeoutint事务的超时时间。如果超过该时间限制但事务还没有完成,则自动回滚事务-1
readOnlyboolean指定事务是否为只读事务false
rollbackForClass[]需要回滚的异常空数组{}
rollbackForClassNameString[]需要回滚的异常类名空数组{}
noRollbackForClass[]不需要回滚的异常空数组{}
noRollbackForClassNameString[]不需要回滚的异常类名空数组{}

在这里插入图片描述

源码解析

我们需要在配置类上加上@EnableTransactionManagement注解,来开启spring事务管理功能,@EnableTransactionManagement最主要的功能就是注入一个TransactionInterceptor拦截器,来控制事务开启,提交或者回滚

ProxyTransactionManagementConfiguration

在这里插入图片描述

TransactionInterceptor#invoke

在这里插入图片描述

TransactionAspectSupport#invokeWithinTransaction

在这里插入图片描述

TransactionAspectSupport#createTransactionIfNecessary

在这里插入图片描述

当开启事务的时候,可以看到各种传播属性的行为

AbstractPlatformTransactionManager#getTransaction

在这里插入图片描述

Spring事务的传播行为在Propagation枚举类中定义了如下几种选择

支持当前事务

  • REQUIRED :如果当前存在事务,则加入该事务。如果当前没有事务,则创建一个新的事务
  • SUPPORTS:如果当前存在事务,则加入该事务 。如果当前没有事务, 则以非事务的方式继续运行
  • MANDATORY :如果当前存在事务,则加入该事务 。如果当前没有事务,则抛出异常

不支持当前事务

  • REQUIRES_NEW :创建一个新事务,如果当前存在事务,则把当前事务挂起
  • NOT_SUPPORTED : 以非事务方式运行,如果当前存在事务,则把当前事务挂起
  • NEVER : 以非事务方式运行,如果当前存在事务,则抛出异常

其他情况

  • NESTED :如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来执行 。如果当前没有事务,则该取值等价于REQUIRED

以NESTED启动的事务内嵌于外部事务中 (如果存在外部事务的话),此时内嵌事务并不是一个独立的事务,它依赖于外部事务。只有通过外部事务的提交,才能引起内部事务的提交,嵌套的子事务不能单独提交

参考博客

https://www.jb51.net/article/229456.htm

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 详解Java语言中的抽象类与继承

    详解Java语言中的抽象类与继承

    这篇文章主要为大家详细介绍了Java语言中的抽象类与继承的相关资料,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的小伙伴快跟随小编一起了解一下
    2022-10-10
  • 浅谈Java实体对象的三种状态以及转换关系

    浅谈Java实体对象的三种状态以及转换关系

    这篇文章主要介绍了浅谈Java实体对象的三种状态以及转换关系,具有一定参考价值,需要的朋友可以,看看。。
    2017-11-11
  • javaWeb实现学生信息管理系统

    javaWeb实现学生信息管理系统

    这篇文章主要为大家详细介绍了javaWeb实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Spring Security OAuth 个性化token的使用

    Spring Security OAuth 个性化token的使用

    这篇文章主要介绍了Spring Security OAuth 个性化token的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 在项目中集成jetty server步骤解析

    在项目中集成jetty server步骤解析

    这篇文章主要介绍了在项目中集成jetty server步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java 8 中 Map 骚操作之 merge() 的使用方法

    Java 8 中 Map 骚操作之 merge() 的使用方法

    本文简单介绍了一下Map.merge()的方法,除此之外,Java 8 中的HashMap实现方法使用了TreeNode和 红黑树,原理很相似,今天通过本文给大家介绍Java 8 中 Map 骚操作之 merge() 的用法 ,需要的朋友参考下吧
    2021-07-07
  • JAVA ServLet创建一个项目的基本步骤

    JAVA ServLet创建一个项目的基本步骤

    Servlet是Server Applet的简称,是运行在服务器上的小程序,用于编写Java的服务器端程序,它的主要作用是接收并响应来自Web客户端的请求,下面这篇文章主要给大家介绍了关于JAVA ServLet创建一个项目的基本步骤,需要的朋友可以参考下
    2024-03-03
  • Java语言多线程终止中的守护线程实例

    Java语言多线程终止中的守护线程实例

    这篇文章主要介绍了Java语言多线程终止中的守护线程实例,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • IDEA配置java开发环境(maven、gradle、tomcat)

    IDEA配置java开发环境(maven、gradle、tomcat)

    这篇文章主要介绍了IDEA配置java开发环境(maven、gradle、tomcat),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring6 的JdbcTemplate的JDBC模板类的使用介绍(最新推荐)

    Spring6 的JdbcTemplate的JDBC模板类的使用介绍(最新推荐)

    JdbcTemplate 是Spring 提供的一个JDBC模板类,是对JDBC的封装,简化JDBC代码,当然,你也可以不用,可以让Spring集成其它的ORM框架,这篇文章主要介绍了Spring6 的JdbcTemplate的JDBC模板类的详细使用说明,需要的朋友可以参考下
    2024-05-05

最新评论