《Mybatis源码》第15章 Transaction

  • Post author:
  • Post category:其他




事务工厂(TransactionFactory)


TransactionFactory

该接口有2个子类

JdbcTransactionFactory



ManagedTransactionFactory

,分别代表JDBC类型 和 MANAGED类型


JdbcTransactionFactory

生产

JdbcTransaction

,会使用

Connection

对象的

commit()



rollback()



close()

方法来管理方法


ManagedTransactionFactory

生产

ManagedTransaction

,会把事务交给容器去管理



TransactionFactory

public interface TransactionFactory {

  void setProperties(Properties props);
    
  // 通过连接创建事务对象
  Transaction newTransaction(Connection conn);
    
  // 通过数据源创建事务对象
  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
    
}



JdbcTransactionFactory

public class JdbcTransactionFactory implements TransactionFactory {

  @Override
  public void setProperties(Properties props) {
  }

  @Override
  public Transaction newTransaction(Connection conn) {
    // 创建JdbcTransaction类型的事务
    return new JdbcTransaction(conn);
  }

  @Override
  public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {
    return new JdbcTransaction(ds, level, autoCommit);
  }
}



ManagedTransactionFactory

public class ManagedTransactionFactory implements TransactionFactory {

  private boolean closeConnection = true;

  @Override
  public void setProperties(Properties props) {
    if (props != null) {
      String closeConnectionProperty = props.getProperty("closeConnection");
      if (closeConnectionProperty != null) {
        closeConnection = Boolean.valueOf(closeConnectionProperty);
      }
    }
  }

  @Override
  public Transaction newTransaction(Connection conn) {
    // 创建ManagedTransaction类型的事务
    return new ManagedTransaction(conn, closeConnection);
  }

  @Override
  public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {
    // Silently ignores autocommit and isolation level, as managed transactions are entirely
    // controlled by an external manager.  It's silently ignored so that
    // code remains portable between managed and unmanaged configurations.
    return new ManagedTransaction(ds, level, closeConnection);
  }
}



事务(Transaction)



Transaction

上面看到了对象工厂创建了

Transaction

类,那么接下来看一下,

Transaction

接口有2个子类

JdbcTransaction



ManagedTransaction

,也就是刚才两个工厂负责创建的

// 方法一看就能看得懂
public interface Transaction {
  
  Connection getConnection() throws SQLException;

  void commit() throws SQLException;

  void rollback() throws SQLException;

  void close() throws SQLException;

  Integer getTimeout() throws SQLException;
  
}



JdbcTransaction


JdbcTransaction

,这里面的commit、rollback方法就重写了,仔细看一下,似乎长得一样,都是判断是否自动提交,然后通过连接去执行方法

public class JdbcTransaction implements Transaction {
  @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();
    }
  }
}



ManagedTransaction


ManagedTransaction

含义为托管事务,空壳事务管理器,皮包公司。仅是提醒用户,在其它环境中应用时,把事务托管给其它框架,比如托管给Spring,让Spring去管理事务,从源码中我们看到 commit 和 rollback 都是空实现

public class ManagedTransaction implements Transaction {
  // 省略一些....
    
  @Override
  public void commit() throws SQLException {
    // Does nothing
  }

  @Override
  public void rollback() throws SQLException {
    // Does nothing
  }
  
  // 省略一些....
}





版权声明:本文为weixin_44051038原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。