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

来源:互联网 发布:吉他班一般多少钱知乎 编辑:程序博客网 时间:2024/06/04 23:32

上一篇文章中我们分析了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,现在你可能还有点疑惑,不过等到我们讲到后面真正使用到他们的时候,你就会豁然开朗.

原创粉丝点击