原创

MyBatis源码解析 - 事务模块

前言

要保证数据库数据一致性离不开事务的支持,本小节我们来分析一下MyBatis事务相关的模块-事务模块。对应的包在org.apache.ibatis.transaction

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接口的实现

Transaction接口有JdbcTransactionManagedTransaction 两个实现,其对象分别由JdbcTransactionFactoryManagedTransactionFactory负责创建。如图所示,这里也使用了工厂方法模式。

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

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

JdbcTransaction的构造函数中会初始化除connection字段之外的其他三个字段,而connection字段会延迟初始化,它会在调用getConnection()方法时通过dataSource.getConnection()方法初始化,并且同时设置autoCommit和事务隔离级别。JdbcTransactioncommit()方法和rollback()方法都会调用Connection对应方法实现的。
ManagedTransaction的实现更加简单,它同样依赖其中的dataSource字段获取连接,但其commit()rollback()方法都是空实现,事务的提交和回滚都是依靠容器管理的。ManagedTransaction中通过closeConnection字段的值控制数据库连接的关闭行为。

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

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

public interface TransactionFactory {

  //配置TransactionFactory对象
  default void setProperties(Properties props) {
    // NOP
  }

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

  //从指定的数据源获取数据库连接,在此连接智商创建Transaction对象
  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
}

JdbcTransactionFactoryManagedTransactionFactory负责创建JdbcTransactionManagedTransaction,这一部分的代码比较简单,就不贴出来了。在实践中,MyBatis通常会与Spring集成使用,数据库的事务是交给Spring进行管理的,在以后的文章中会介绍Transaction接口的另一个实现-SpringManagedTransaction

正文到此结束