码迷,mamicode.com
首页 > 其他好文 > 详细

mybatis对事务的管理

时间:2018-08-30 01:53:09      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:rollback   exe   err   desire   bool   from   nsa   defaults   etc   

1、在获取一个session的时候会从tranactionFactory实例化一个对象放到session的属性中

  public SqlSession openSession() {
    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
  }
   private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();
      // 从environment 这里就两种一个是JdbcTransaction 一个是 ManagedTransaction
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      // 获取一个事务
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

2、什么时候开启事务呢?

 // BaseExcutor 中获取connection时会调用事务的getConnection方法
 protected Connection getConnection(Log statementLog) throws SQLException {
    Connection connection = transaction.getConnection();
    if (statementLog.isDebugEnabled()) {
      return ConnectionLogger.newInstance(connection, statementLog, queryStack);
    } else {
      return connection;
    }
  }
  //transaction.getConnection
  public Connection getConnection() throws SQLException {
    if (connection == null) {
      openConnection();
    }
    return connection;
  }
  // openConnection
   protected void openConnection() throws SQLException {
    if (log.isDebugEnabled()) {
      log.debug("Opening JDBC Connection");
    }
    connection = dataSource.getConnection();
    if (level != null) {
      // 设置隔离级别
      connection.setTransactionIsolation(level.getLevel());
    }
    // 是否关闭自动提交事务
    setDesiredAutoCommit(autoCommmit);
  }

3、什么时候提交或者关闭事务呢?

 // Session.close()
 public void close() {
    try {
      executor.close(isCommitOrRollbackRequired(false));
      dirty = false;
    } finally {
      ErrorContext.instance().reset();
    }
  }
  // CachingExcutor.close()
  public void close(boolean forceRollback) {
    try {
      //issues #499, #524 and #573
      if (forceRollback) { 
          //事务的回滚
        tcm.rollback();
      } else {
          //事务的提交
        tcm.commit();
      }
    } finally {
      delegate.close(forceRollback);
    }
  }

 

mybatis对事务的管理

标签:rollback   exe   err   desire   bool   from   nsa   defaults   etc   

原文地址:https://www.cnblogs.com/jas0/p/9557796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!