mybatis源码解析之基础模块-Transaction

本文深入解析MyBatis的Transaction模块,包括Transaction接口、TransactionFactory、JdbcTransaction和ManagedTransaction的详细内容,阐述了MyBatis在事务管理上的抽象方案和简单实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

MyBatis源码解析之基础模块—Transaction

前文回顾

上一篇,咱们一起学习了Mybatis的DataSource模块相关源码,掌握了三种数据源工厂的逻辑,同时也掌握非池化数据源的连接创建,池化数据源如何从空闲列表获取连接并放到活跃连接列表,及连接的归还到空闲队列的逻辑。

下面跟随笔者的思路,咱们继续学习另一个重要模块——Transaction模块。

核心要点

本篇幅主要讲解Mybatis在事务管理的抽象方案,以及提供的两种简单实现:jdbc实现及外部容器的处理逻辑。

架构设计

Transaction模块所在包路径为org.apache.ibatis.transaction,其具体划分如下:

transaction
- jdbc
  - JdbcTransaction
  - JdbcTransactionFactory
- managed
  - ManagedTransaction
  - ManagedTransactionFactory
- DataSourceException
- TransactionFactory
- Transaction

老规矩,咱们先从宏观架构图上了解设计脉络,见下图:

在这里插入图片描述

不想说又不得不说,Mybatis真是将Factory设计模式用户的炉火纯青。纵观整个项目源码,大量的使用工厂或工厂方法模式。

源码解读

基于面向接口编程的思路,咱们首先看下Mybatis事务管理中的两个核心接口:TransactionTransactionFactory

Transaction

正如Mybatis作者对该接口的定义:

// Handles the connection lifecycle that comprises: its creation, preparation, commit/rollback and close.

翻译过来就是:处理整个连接生命周期的各种操作,包括连接创建,事务提交、回滚及连接关闭等数据库事务相关的操作。

该接口共有五个方法。对于码畜们来说,源码加注释才是国际通用语言。各方法描述如下:

/**
 * 处理整个连接生命周期的各种操作,包括连接创建,事务提交、回滚及连接关闭等数据库事务相关的操作。
 */
public interface Transaction {
   

  /** 获取数据库连接 */
  Connection getConnection() throws SQLException;

  /** 数据提交 */
  void commit() throws SQLException;

  /** 数据回滚 */
  void rollback() throws SQLException;

  /** 关闭数据库连接 */
  void close() throws SQLException;

  /** 获取超时时间,如果设置的话,Mybatis默认的两种实现,均设置为null */
  Integer getTimeout() throws SQLException;
}

以上为Transaction事务处理的核心接口方法。具体的实现逻辑等咱们稍后进行解析说明。

TransactionFactory

见名知意,该接口为事务的创建工厂,其唯一的目的就是创建事务对象。从源码中可以看出TransactionFactory功能非常简单,就是获取事务对象。当然获取事务前会设置相关属性。具体见代码加注释:

package org.apache.ibatis.transaction;

import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.session.TransactionIsolationLevel;

/**
 * 事务创建工厂接口
 */
public interface TransactionFactory {
   
   */
  /** 设置相关配置信息 */
  default void setProperties(Properties props) {
   
    // NOP
  }

  /** 根据连接对象获取事务对象 */
  Transaction newTransaction(Connection conn);

  /**根据数据源、事务隔离级别、是否自动提交属性 构建事务对象*/
  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
}

一个设置配置信息的方法,两个获取事务对象的重载方法。

JdbcTransaction

接下来看下基于jdbc的事务管理方案:

JdbcTransaction类实现中有四个属性。分别为连接对象、数据源、事务隔离级别、是否自动提交等。

其构造方法有两个。一个是基于connection对象为参数的构造方法。一个则是基于数据源、事务隔离级别、autoCommit为参数的构造方法。

然后学习下JdbcTransaction实现的几个方法:

getConnection() :首选判断connection对象是否为null,为null的情况下通过调用私有方法openConnection()来获取连接对象。

commit():在connection非空且设置为手动提交的方式下,执行数据库连接提交操作。

rollback():在connection非空且设置为手动提交的方式下,执行数据库连接回滚操作。

close():在connection非空时执行数据库连接关闭操作,当然,如果数据库为手动提交,则先设置为自动提交。

具体请看源码及注释:

package org.apache.ibatis.transaction.jdbc;

import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;

import org.</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值