聊聊Mybatis的事务模块

举报
周杰伦本人 发表于 2022/08/30 10:19:06 2022/08/30
【摘要】 聊聊Mybatis的事务模块 工厂模式中的产品 JdbcTransaction类 获取连接 事务的提交和回滚 ManagedTransaction类 事务的提交和回滚 关闭连接 工厂模式中的工厂 总结 聊聊Mybatis的事务模块mybatis定义了自己的事务接口来实现事务,这里同样也使用了工厂模式 工厂模式中的产品Transaction接口相当于工厂模式中的产品的角色,我们不妨看看他的接...

聊聊Mybatis的事务模块

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接口作为事务接口,定义了我们事务操作经常用到的事务连接、提交事务、回滚事务、关闭事务和获取超时等方法。

JdbcTransaction和ManagedTransaction分别实现了这个接口,

JdbcTransaction类

JdbcTransaction类就是基于jdbc链接来实现的事务

获取连接

下面是JdbcTransaction的获取连接getConnection()方法的实现,他们看一看它在实现逻辑:

  @Override
  public Connection getConnection() throws SQLException {
    if (connection == null) {
      openConnection();
    }
    return connection;
  }
  protected void openConnection() throws SQLException {
    if (log.isDebugEnabled()) {
      log.debug("Opening JDBC Connection");
    }
    connection = dataSource.getConnection();
    if (level != null) {
      connection.setTransactionIsolation(level.getLevel());
    }
    setDesiredAutoCommit(autoCommit);
  }

获取连接是通过dataSource.getConnection()方法中获取的,然后设置事务隔离级别

事务的提交和回滚

JdbcTransaction的事务提交和回滚方法:

@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();
    }
  }

通过源码我们看到事务的提交和回滚都是调用Connection类中的commit()方法和rollback()方法,整体逻辑是比较简单的。

ManagedTransaction类

ManagedTransaction是通过容器来管理事务,所以他的事务提交和回滚的方法都是null

事务的提交和回滚
@Override
  public void commit() throws SQLException {
    // Does nothing
  }

  @Override
  public void rollback() throws SQLException {
    // Does nothing
  }
关闭连接

另外ManagedTransaction的close()方法默认关闭数据库的连接,但是这个可以通过closeConnection来进行配置

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

这两个类获取连接的方法实现都是一样的,都采用了延迟加载,也就是说当getConnection()被调用的时候才会初始化Connection

工厂模式中的工厂

Mybatis定义了TransactionFactory接口,实现类有JdbcTransactionFactory工厂类和ManagedTransactionFactory工厂类,分别用来创建JdbcTransaction类和ManagedTransaction类

总结

这篇文章主要讲了Mybatis源码中的transaction包下的类和接口,主要是工厂模式的实现:

  • 工厂有TransactionFactory接口,实现类JdbcTransactionFactory和ManagedTransactionFactory,这两个工厂类分别创建产品JdbcTransaction和ManagedTransaction,
  • 产品接口是Transaction,JdbcTransaction和ManagedTransaction连接信息都是延迟加载,使用的时候通过调用getConnection()进行加载,方法内是调用DataSource的getConnection()方法
  • JdbcTransaction提交和回滚方法调用Connection的提交和回滚方法
  • ManagedTransaction的提交和回滚是空,通过容器来管理事务的提交和回滚
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。