Configuration--environments--transactionManager(三-5-2)

上一篇文章中我们分析了dataSource,本篇文章中我们来分析environments中的另一个配置transactionManager.

首先我们来回忆一下解析environments标签时,解析transactionManager标签的代码:

TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
  private TransactionFactory transactionManagerElement(XNode context) throws Exception {
    if (context != null) {
      String type = context.getStringAttribute("type");
      Properties props = context.getChildrenAsProperties();
      TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance();
      factory.setProperties(props);
      return factory;
    }
    throw new BuilderException("Environment declaration requires a TransactionFactory.");
  }

从上述代码我们可以看出,最终我们是需要一个TransactionFactory,当然我们可以自定义,但是本篇文章,我们先来了解一下mybaits内置的TransactionFactory :
1.JDBC: 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域.
2.MANAGED:这个配置几乎没做什么,它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文).

Configuration类的构造方法中,已经帮我们定义了这两个类的别名:

    typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
    typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);

在看mybaits内置的事务管理器之前,我们先来看一下其TransactionFactory接口的定义:

public interface TransactionFactory {
  void setProperties(Properties props);

  Transaction newTransaction(Connection conn);

  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);

}

可以看到,主要的方法就是设置参数和获取Transaction.

我们再来看Transaction接口的定义:

public interface Transaction {
  Connection getConnection() throws SQLException;

  void commit() throws SQLException;

  void rollback() throws SQLException;

  void close() throws SQLException;

}

主要方法是获取Connection,提交事务,回滚事务,从这里我们可以看出,其实Transaction就是对Connection的封装.


1.JdbcTransactionFactory

public class JdbcTransactionFactory implements TransactionFactory {

  public void setProperties(Properties props) {
  }

  public Transaction newTransaction(Connection conn) {
    return new JdbcTransaction(conn);
  }

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

从上述代码,我们可以看出,JdbcTransactionFactory的主要作用就是创建JdbcTransaction,具体的事务操作,还是由JdbcTransaction完成的.

我们首先来看JdbcTransaction的构造方法:

  // 直接传入一个Connection
  public JdbcTransaction(Connection connection) {
    this.connection = connection;
  }

  // 传入一个DataSource,可想而知,之后会通过DataSource获取Connection
  public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
    dataSource = ds;
    level = desiredLevel;
    autoCommmit = desiredAutoCommit;
  }

再来看JdbcTransactiongetConnection方法:

  public Connection getConnection() throws SQLException {
    // 果然,当我们构造方法传入的是DataSource时,会通过openConnection去获取一个新的连接
    if (connection == null) {
      openConnection();
    }
    return connection;
  }

  protected void openConnection() throws SQLException {
    if (log.isDebugEnabled()) {
      log.debug("Opening JDBC Connection");
    }
    // 通过传入的dataSource获取一个新的Connection
    connection = dataSource.getConnection();
    if (level != null) {
      // 设置Connection隔离级别
      connection.setTransactionIsolation(level.getLevel());
    }
    // 设置是否自动提交
    setDesiredAutoCommit(autoCommmit);
  }

  protected void setDesiredAutoCommit(boolean desiredAutoCommit) {
    try {
      // 这里可以看出,最终将以事务定义的是否自动提交为准
      if (connection.getAutoCommit() != desiredAutoCommit) {
        if (log.isDebugEnabled()) {
          log.debug("Setting autocommit to " + desiredAutoCommit + " on JDBC Connection [" + connection + "]");
        }
        connection.setAutoCommit(desiredAutoCommit);
      }
    } catch (SQLException e) {
      throw new TransactionException("Error configuring AutoCommit.  "
          + "Your driver may not support getAutoCommit() or setAutoCommit(). "
          + "Requested setting: " + desiredAutoCommit + ".  Cause: " + e, e);
    }
  }

接着我们再来看commit,rollbackclose方法:

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

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

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

我们可以看出JdbcTransaction实际上就是使用了Connection本身的事务控制,最终都是调用Connection的方法.

2.ManagedTransactionFactory

其实ManagedTransactionFactory也没有特别的地方,主要的就是ManagedTransactionFactory生成的ManagedTransaction.

ManagedTransactioncommitrollback方法都是空的,不做具体的操作,所以我们之前说,这种方式是让容器来管理事务.

  public void commit() throws SQLException {
    // Does nothing
  }

  public void rollback() throws SQLException {
    // Does nothing
  }

综上,我们就了解了dataSourcetransactionManager,现在你可能还有点疑惑,不过等到我们讲到后面真正使用到他们的时候,你就会豁然开朗.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值