广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring数据库事务的实现机制讲解
  • 827
分享到

Spring数据库事务的实现机制讲解

2024-04-02 19:04:59 827人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录事务控制的核心——Connection用aop技术保持当前的ConnectionService层和Dao层共享Connection事务为什么要切在Service层的理由sprin

事务控制的核心——Connection

在开始之前,先让我们回忆一下数据库较原始的JDBC是怎么管理事务的:


    //仅做演示,代码不完整,不完全规范
    try {
        con.setAutoCommit(false);
        statement1 = con.prepareStatement(sql);
        statement1.executeUpdate();
        statement2 = con.prepareStatement(sql1);
        statement2.executeUpdate();
        con.commit();
    } catch (SQLException e) {
        try {
            con.rollback();
        } catch (SQLException e1) {
        }
    }

可以很明显的看到,JDBC框架下的事务控制是由connection完成的。因为不论是mybatis还是MyBatis-Spring都是在JDBC框架基础上的高层框架,所以他们的原理仍然应该是一致的,也就是说想控制事务,必须要控制Connection。

我们常说事务要切在Service层,所以连接需要在整个Service请求中都是同一个,不能变。

用AOP技术保持当前的Connection

Spring的事务管理就是使用AOP技术,通过对Service层设置切面,注入事务管理的逻辑。

Spring的事务管理切面配置采用了声明式事务,最常用的两种方法是 tx:Advice 和 tx:annotation-driven 两种方式。

两种方式的配置文件解析器分别是:

org.springframework.transaction.config.TxAdviceBeanDefinitionParser

org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser

细看其中的代码和配置内容,就会发现,不论哪种方式都会创建包含事务处理功能的动态代理。代理关联的切面(Advice)类是 TransactionInterceptor 。

一起看下关键代码:


   protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation)
            throws Throwable {
        //......
        if (txAttr == null || !(tm instanceof CallbackPreferringPlatfORMTransactionManager)) {
            TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);//-----1.开启事务
            Object retVal = null;
            try {
                retVal = invocation.proceedWithInvocation();//...2.执行被代理的请求
            }
            catch (Throwable ex) {
completeTransactionAfterThrowing(txInfo, ex);//...3.异常回滚
                throw ex;
            }
            finally {
                cleanupTransactionInfo(txInfo);
            }
            commitTransactionAfterReturning(txInfo);//...4.提交事务
            return retVal;
        }
        //......

上边的代码里是不是没有看到TransactionManger和Connection?那么这两个东西的作用在哪里呢?

TransactionManger是上述TransactionInterceptor的一个属性(不严的说),主要作用是用来创建connection,创建之后的Connection会被保存在TransactionInfo里面。

TransactionInfo在上述代码片段中被后续传递给事务提交和事务回滚的代码。

Service层和Dao层共享Connection

我们都知道事务要切在Service层,也就是说上一节的切面只是在Service层有效,那么Dao层怎么获取到Connection连接呢?

如果Service层和Dao层的连接不是一个连接那么回滚和提交操作就等同于无效了!

这里只用MyBatis来说明,其他的ORM框架实现原理基本也是一样的。

要明白这一点需要先弄明白MyBatis本身的事务管理机制,可以参考MyBatis源码解析之Transaction事务模块。MyBatis提供了两种事务管理机制一种是自己内部用的JDBC模式,一种是支持代理给外部控制的MANAGED模式。

第二种模式下会把事务的交给外部控制,外部只需要提供一个实现了 org.apache.ibatis.transaction.Transaction 接口的控制类即可。

一起来看一下Transaction需要提供哪些方法:


public interface Transaction {
  Connection getConnection() throws SQLException;
  void commit() throws SQLException;
  void rollback() throws SQLException;
  void close() throws SQLException;
}

注意里边的getConnection方法,也就是说MyBatis的连接也是交给外部来获取的!!那么只需要想办法把Service层的Connection存起来,然后让自己实现Transaction获取到即可。

Spring采用的是ThreadLocal本地线程变量的技术来做到的,我们可以看下mybatis-spring的 org.mybatis.spring.transaction.SpringManagedTransaction 中getConnection的实现就明白了:


  public Connection getConnection() throws SQLException {
    if (this.connection == null) {
      openConnection();
    }
    return this.connection;
  }

  private void openConnection() throws SQLException {
    this.connection = DataSourceUtils.getConnection(this.dataSource);//...1.关键点在这里!!
    this.autoCommit = this.connection.getAutoCommit();
    this.isConnectionTransactional = DataSourceUtils.isConnectionTransactional(this.connection, this.dataSource);
    if (LOGGER.isDebugEnabled()) {
      LOGGER.debug(
          "JDBC Connection ["
              + this.connection
              + "] will"
              + (this.isConnectionTransactional ? " " : " not ")
              + "be managed by Spring");
    }
  }

其中


this.connection = DataSourceUtils.getConnection(this.dataSource); 

一行就会从ThreadLocal中拿到Connection对象。

事务为什么要切在Service层的理由

对于这个常识,有一点个人的理解:

事务的ACID要求事务要有原子性,也就是一个事务里边的多项DB操作要同时成功,同时失败,成功一半的情况是不允许的。

也就是说,一般需要事务的时候,都是包含多个功能单元的。那么我们都放在一个Dao里面就显得不那么职能分明,也就是不那么符合设计原则的单一职责原则。

spring事务与数据库事务的区别

先说一下什么是事务,事务(Transaction):

一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,c++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。。

之前一直觉得事务只针对于数据库当中,5种隔离级别,7种传播行为,后来才发现这是针对Spring的,对数据库来说隔离级别只有4种,Spring多了一个DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

总的来说,本质上其实是同一个概念

spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的

数据库的事务说简单就只有开启,回滚和关闭,spring对数据库事务的包装,原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作.但是spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理.其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装.事务与隔离级别放在一起理解会更好些。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Spring数据库事务的实现机制讲解

本文链接: https://www.lsjlt.com/news/137523.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring数据库事务的实现机制讲解
    目录事务控制的核心——Connection用AOP技术保持当前的ConnectionService层和Dao层共享Connection事务为什么要切在Service层的理由sprin...
    99+
    2022-11-12
  • Spring超详细讲解事务和事务传播机制
    目录为什么需要事务Spring 声明事务Transactional参数说明propagationisolationtimeout事务回滚失效解决方案@Transactional工作原...
    99+
    2022-11-13
  • spring-boot中的SPI机制实例讲解
    一、从java类加载机制说起 java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器Bootstrap Cl...
    99+
    2022-11-12
  • 总结Spring中事务的使用、抽象机制及模拟Spring事务实现
    本篇内容介绍了“总结Spring中事务的使用、抽象机制及模拟Spring事务实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细...
    99+
    2022-10-18
  • MySQL数据库事务transaction示例讲解教程
    目录1、什么是事务?2、和事务相关的语句只有这3个DML语句:insert、delete、update3、假设所有的业务都能使用1条DML语句搞定,还需要事务机制吗?4、事务的原理5...
    99+
    2022-11-12
  • 深入了解Spring的事务传播机制
    目录Spring 事务传播机制有哪些?事务传播机制使用与演示REQUIRED 使用演示REQUIRED_NEW 使用演示NESTED 使用演示总结Spring 事务传播机制是指,包含...
    99+
    2022-11-13
  • Spring的事务控制实现方法
    Spring的事务控制实现,供大家参考,具体内容如下 提示:这里使用的是xml的方式配置事务的 前言 例:当银行转账的时候,如果转账和收款的一方出现问题,那么这次的转账则不成功,此处...
    99+
    2022-11-13
  • Spring基于Aop实现事务管理流程详细讲解
    目录aop在spring事务中的运用基于纯注解实现spring事务管理基于xml文件实现Spring事务管理aop在spring事务中的运用 在Spring中,AOP和事务管理是两个...
    99+
    2023-05-20
    Spring Aop事务管理 Spring实现事务管理
  • Spring AbstractRoutingDatasource 动态数据源的实例讲解
    Spring AbstractRoutingDatasource 动态数据源 数据源上下文 AbstractRoutingDatasource 需要信息决定路由到那个数据源,该信息我...
    99+
    2022-11-12
  • 一文解析spring中事务的传播机制
    今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。Spring中的事务Spring的事务其实就是数据库的事务操作,符合ACID标...
    99+
    2023-07-06
  • 如何理解Spring的Hibernate事务管理机制
    如何理解Spring的Hibernate事务管理机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。主要讲了Spring 声明式事务让我们从复杂的Hibernate事务处理中...
    99+
    2023-06-17
  • 详解在Spring Boot中使用数据库事务
    我们在前面已经分别介绍了如何在spring Boot中使用JPA以及如何在Spring Boot中输出REST资源。那么关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利...
    99+
    2023-05-31
    spring boot 数据库
  • MySQL数据库存储过程和事务的区别讲解
    事务是保证多个SQL语句的原子型的,也就是要么一起完成,要么一起不完成 存储过程是把一批SQL语句预编译后放在服务器上,然后可以远程调用 存储过程: 一组为了完成特定功能的SQL语句集(或者自定义数据库操作...
    99+
    2022-10-18
  • 使用spring框架实现数据库事务处理方式
    目录使用spring框架实现数据库事务处理JDBC对数据库事务处理的支持JDBC定义了五种事务隔离级别来解决这些并发导致的问题在spring框架中调用一个数据库事务处理分三步走:sp...
    99+
    2022-11-12
  • Spring整合多数据源实现动态切换的实例讲解
    在实际项目中时常需要连接多个数据库,而且不同的业务需求在实现过程当中往往需要访问不同的数据库。jdbc.properties配置文件,配置多个dataSource##########################MySQL########...
    99+
    2023-05-31
    多数据源 动态切换 spring
  • Spring七大事务传递机制的实现原理是什么
    这篇“Spring七大事务传递机制的实现原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring七大事务传递机制...
    99+
    2023-07-05
  • 如何理解Spring AOP的实现机制
    这篇文章将为大家详细讲解有关如何理解Spring AOP的实现机制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。AOP(Aspect Orient Programming),一般称为面向切面...
    99+
    2023-06-16
  • spring基于注解配置实现事务控制操作
    目录spring注解配置实现事务控制1、导入相关依赖2、创建spring配置类3、创建JdbcConfig数据源配置类4、创建TransactionConfig事务配置类5、创建jd...
    99+
    2022-11-12
  • Spring Boot人使用Redis数据库的缓存机制
    Spring Boot人使用Redis数据库的缓存机制?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。本文章牵涉到的技术点比较多:spring Data JPA、Redis、Sp...
    99+
    2023-05-31
    springboot 缓存机制 redis
  • 解读Spring事务是如何实现的
    目录Spring事务如何实现Spring事务实现的几种方式编程式事务管理声明式事务管理总结Spring事务如何实现 1.Spring事务底层是基于数据库事务和AOP机制的 2.首先对...
    99+
    2023-03-19
    Spring事务 Spring事务实现 Spring如何实现事务
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作