聊聊mybatis的事务模块(代码片段)

周杰伦本人 周杰伦本人     2022-12-01     127

关键词:

@[TOC]

聊聊Mybatis的事务模块

mybatis定义了自己的事务接口来实现事务,这里同样也使用了工厂模式

工厂模式中的产品

Transaction接口:

public interface Transaction 

  Connection getConnection() throws SQLException;

  void commit() throws SQLException;

  void rollback() throws SQLException;
  void close() throws SQLException;
  Integer getTimeout() throws SQLException;

JdbcTransaction和ManagedTransaction分别实现了这个接口,

JdbcTransaction的获取连接getConnection()方法:

  @Override
  public Connection getConnection() throws SQLException 
    if (connection == null) 
      openConnection();
    
    return connection;
  
  protected void openConnection() throws SQLException 
    if (log.isDebugEnabled()) 
      log.debug("Opening JDBC Connection");
    
    connection = dataSource.getConnection();
    if (level != null) 
      connection.setTransactionIsolation(level.getLevel());
    
    setDesiredAutoCommit(autoCommit);
  

获取连接是通过dataSource.getConnection()方法中获取的,然后设置事务隔离级别

JdbcTransaction的事务提交和回滚方法:

@Override
  public void commit() throws SQLException 
    if (connection != null && !connection.getAutoCommit()) 
      if (log.isDebugEnabled()) 
        log.debug("Committing JDBC Connection [" + connection + "]");
      
      connection.commit();
    
  

  @Override
  public void rollback() throws SQLException 
    if (connection != null && !connection.getAutoCommit()) 
      if (log.isDebugEnabled()) 
        log.debug("Rolling back JDBC Connection [" + connection + "]");
      
      connection.rollback();
    
  

通过源码我们看到事务的提交和回滚都是调用Connection类中的commit()方法和rollback()方法

ManagedTransaction是通过容器来管理事务,所以他的事务提交和回滚的方法都是null

@Override
  public void commit() throws SQLException 
    // Does nothing
  

  @Override
  public void rollback() throws SQLException 
    // Does nothing
  

另外ManagedTransaction的close()方法默认关闭数据库的连接,但是这个可以通过closeConnection来进行配置

  @Override
  public void close() throws SQLException 
    if (this.closeConnection && this.connection != null) 
      if (log.isDebugEnabled()) 
        log.debug("Closing JDBC Connection [" + this.connection + "]");
      
      this.connection.close();
    
  

这两个类获取连接的方法实现都是一样的,都采用了延迟加载,当getConnection()被调用的时候才会初始化Connection

工厂模式中的工厂

Mybatis定义了TransactionFactory,实现类有JdbcTransactionFactory和ManagedTransactionFactory,分别用来创建JdbcTransaction类和ManagedTransaction类

总结

这篇文章主要讲了Mybatis源码中的transaction包下的类和接口,主要是工厂模式的实现:

  • 工厂有TransactionFactory接口,实现类JdbcTransactionFactory和ManagedTransactionFactory,这两个工厂类分别创建产品JdbcTransaction和ManagedTransaction,
  • 产品接口是Transaction,JdbcTransaction和ManagedTransaction连接信息都是延迟加载,使用的时候通过调用getConnection()进行加载,方法内是调用DataSource的getConnection()方法
  • JdbcTransaction提交和回滚方法调用Connection的提交和回滚方法
  • ManagedTransaction的提交和回滚是空,通过容器来管理事务的提交和回滚

聊聊mybatis的日志模块的适配器模式(代码片段)

@[TOC]聊聊Mybatis的日志模块的适配器模式我们在开发中日志是必不可少的一部分,而市场中有很多日志框架供我们使用,mybatis作为一个开源框架需要兼容这些框架,mybatis用了适配器模式来兼容这些框架,适配器模式就是通过组合... 查看详情

聊聊mybatis缓存(代码片段)

聊聊MyBatis缓存你好,我是悟空。本文主要内容如下:一、MyBatis缓存中的常用概念MyBatis缓存:它用来优化SQL数据库查询的,但是可能会产生脏数据。SqlSession:代表和数据库的一次会话,向用户提供了操作数据库的方法。MappedState... 查看详情

聊聊mybatis的basestatementhandler的三个子类(代码片段)

@[TOC]聊聊Mybatis的BaseStatementHandler的三个子类今天我们继续聊StatementHandler的实现类PreparedStatementHandlerPreparedStatementHandler处理的是包含?占位符的sql语句,所以它需要进行参数绑定:@Overridepublicvoidparameterize(Statementstatement)thro 查看详情

聊聊mybatis与spring的整合(代码片段)

@[TOC]聊聊Mybatis与Spring的整合Mybatis与Spring整合需要一个依赖包<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId></dependency>我们分析一下这个包下面的一些类SqlSess 查看详情

java框架!聊聊mybatis的历史(代码片段)

原生的mybatis(使用xml)关于别名关于namespace原生的mybatis(使用注解)Mybatis与springMapperFactoryBeanSqlSessionDaoSupportMybatis与springBootMybatis与mybatis-plus序言==最近项目中,需要在mysql里面 查看详情

聊聊mybatis的动态sql之sqlsource(代码片段)

聊聊Mybatis的动态Sql之SqlSource构建SqlSource对象当Mapper.xml的各个标签被解析后SqlNode,然后SqlSourceBuilder进一步处理,publicSqlSourceparse(StringoriginalSql,Class<?>parameterType,Map<String,Object>additionalParameter 查看详情

聊聊spring事务失效的12种场景,太坑了(代码片段)

如果当前上下文中存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值。SUPPORTS如果当前上下文存在事务,则支持事务加入事务,如果不存在事务,则使用非事务的方式执行。MANDATORY如果当前上... 查看详情

阿里4面:聊聊分布式事务的解决方案???(代码片段)

阿里4面:聊聊分布式事务的解决方案???公众号关注“架构师学习营”设为“星标”,带你学习更多架构师知识!大家好,这里是架构师学习营。本文继续分享分布式事务的另一种常见的解决方案:TCC什么是TCC?TCC场景案例TCC... 查看详情

聊聊spring事务控制策略以及@transactional失效问题避坑(代码片段)

大家好,又见面了。在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。比如,需要对SQL执行过程进行事务的控制与处理的时候,其整体的处理流程会是如下的示意:首先是要开启事务、然后... 查看详情

聊聊mybatis的动态sql之这三个sqlnode同样重要(代码片段)

@[TOC]聊聊Mybatis的动态Sql之这三个SqlNode同样重要ForEachSqlNodeForEachSqlNode是解析出&lt;foreach&gt;的对象,@Overridepublicbooleanapply(DynamicContextcontext)Map<String,Object>bindings=context.getBindings(); 查看详情

mybatis深入理解-----mybatis事务管理机制(代码片段)

MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面。本文将讲述MyBatis的事务管理的实现机制。首先介绍MyBatis的事务Transaction的接口设计以及其不同实现JdbcTransaction和ManagedTransaction;接着,从MyBatis的XM... 查看详情

聊聊mybatis的statementhandler接口和它的实现类(代码片段)

@[TOC]聊聊Mybatis的StatementHandler接口和它的实现类今天我们看一下StatementHandler接口和它下面的实现类,这个接口中定义了prepare()方法创建Statement对象,为sql绑定参数的parameterize(),还有一些执行sql的方法,单看接口也看不出来啥,... 查看详情

聊聊mybatis的初始化之mapper.xml映射文件的解析(代码片段)

@[TOC]聊聊Mybatis的初始化之Mapper.xml映射文件的解析解析完全局配置文件后接下来就是解析Mapper文件了,它是通过XMLMapperBuilder来进行解析的解析Mapper文件入口XMLMapperBuilder的parse()方法:publicvoidparse()if(!configuration.isResourceLoaded(resource)... 查看详情

mybatis事务管理机制详解(代码片段)

1.mybatis事务的配置和使用mybatis事务有两种使用方式:(a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作。(b):使用MANAGED的事务管理机制:mybatis本身不会去实现事务管理的相关操作,而... 查看详情

聊聊spring事务失效的12种场景,太坑了(代码片段)

前言对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避... 查看详情

聊聊spring事务控制策略以及@transactional失效问题避坑(代码片段)

在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。比如,需要对SQL执行过程进行事务的控制与处理的时候,其整体的处理流程会是如下的示意:首先是要开启事务、然后执行... 查看详情

聊聊spring事务控制策略以及@transactional失效问题避坑(代码片段)

在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。比如,需要对SQL执行过程进行事务的控制与处理的时候,其整体的处理流程会是如下的示意:首先是要开启事务、然后执行... 查看详情

探囊取物,取出mybatis内部事务(代码片段)

文章目录一、前言二、事务概要2.1从数据库事务到Mybatis事务2.2Mybatis事务的两种形式三、事务的创建3.1mybatis-config.xml配置3.2创建事务工厂3.2.1parse()3.2.2parseConfiguration()3.2.3environmentsElement()3.2.4transactionManagerElement()3.3创建事务Transacti 查看详情