MyBatis基础支持层位于 Mybatis 整体架构的最底层,支撑着 Mybatis 的核心处理层,是整个框架的基石。基础支持层中封装了多个较为通用的、独立的模块,不仅仅为 Mybatis 提供基础支撑,也可以在合适的场景中直接复用。

整体架构

这篇文章介绍MyBatis的Transaction模块

在实 践 开 发 中,控制数 据库 事务 是一件非常重要的工作,MyBatis使 用 Transaction接口对数据库事务进 行了抽象,Transaction接口的定义 如下:

public interface Transaction {

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

/**
* 提交事务
*/
void commit() throws SQLException;

/**
* 回滚事务
*/
void rollback() throws SQLException;

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

/**
* 获取事务超时时间
*/
Integer getTimeout() throws SQLException;

}

Transaction 接 口 有 JdbcTransactionManagedTransaction 两 个 实 现 , 其 对 象 分 别 由

JdbcTransactionFactoryManagedTransactionFactory负 责 创 建。这 里也使用 工厂 方法模式。

image-20200609173458476

JdbcTransaction

JdbcTransaction依赖于 JDBC Connection控制事务的提交和回 滚 。JdbcTransaction中 字 段 的 含义 如下:

// 事务对应的数据库连接
protected Connection connection;
// 数据库连接所属的DataSource
protected DataSource dataSource;
// 事务隔离级别
protected TransactionIsolationLevel level;
// 是否自动提交
protected boolean autoCommmit;

JdbcTransaction的构 造函数 中会 初始化除connection字段之外的其他三个 字段,而 connection字段会 延迟 初始化,它 会 在调 用getConnection()方法时 通过 dataSource.getConnection() 方法初始化,并 且同时 设 置autoCommit和事务 隔离 级 别 。

JdbcTransaction的 commit()方法和 rollback()方法都会 调 用Connection对 应 方法实 现 的。

ManagedTransaction

ManagedTransaction的实 现 更加简 单 ,它 同样 依赖 其中的dataSource字段获 取连 接,但其 commit()rollback()方法都是空实 现 ,事务 的提交和回滚 都是依靠 容器管理的。

ManagedTransaction中通过 closeConnection字段的值 控制数 据库 连 接的关 闭 行为 。

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

TransactionFactory

TransactionFactory接 口 定 义 了 配 置 新 建 TransactionFactory对 象 的 方 法 , 以 及 创 建 Transaction对 象的方法,代码 如下:

public interface TransactionFactory {

/**
* 配置TransactionFactory对 象,一般紧 跟 在创 建完成之后,完成对 TransactionFactory的自定义 配置
*/
void setProperties(Properties props);

/**
* 在指定的连 接上创 建Transaction对 象
*/
Transaction newTransaction(Connection conn);

/**
* 从 指定数 据源中获 取数 据库 连 接,并 在此连 接之上创 建Transaction对 象
*/
Transaction newTransaction(DataSource dataSource,
TransactionIsolationLevel level, boolean autoCommit);

}

JdbcTransactionFactoryManagedTransactionFactory 负 责 创 建 JdbcTransactionManagedTransaction,这 一部分的代码 比较 简 单 。

参考

  • 《MyBatis技术内幕》

  • 部分图片来源——《MyBatis技术内幕》