本章简单介绍一下 MyBatis 的事务模块,这块内容比较简单,主要为后面介绍 mybatis-spring-1.**.jar(MyBatis 与 Spring 集成)中的事务模块做准备。

类图结构

MyBatis 事务模块的代码在 transaction 包下:

image.png

根据包的分类,提供了两种事务实现:jdbc、managed。

我们还是先来看下事务模块整体的类图结构:

image.png

MyBatis 的事务模块和事务模块一样,使用的也是工厂方法设计模式。那么它扩展的方式肯定也是提供相应的事务工厂实现类和事务实现类。

简单描述事务模块各个类的功能:

  • JdbcTransactionFactory 和 ManagedTransactionFactory 负责创建 JdbcTransaction 和 ManagedTransaction 对象。
  • JdbcTransaction 类中封装了 DataSource 对象和 Connection 对象,依赖 JDBC Connection 控制事务的提交和回滚。
  • ManagedTransaction 类中同样封装了 DataSource 对象和 Connection 对象,但其 commit()、rollback() 方法都是空实现。

在 MyBatis 加载配置文件的时候,会解析配置文件,根据 transactionManager 节点配置的内容生成相应的工厂类对象。XMLConfigBuilder#transactionManagerElement 源码如下所示:

  1. private TransactionFactory transactionManagerElement(XNode context) throws Exception {
  2. if (context != null) {
  3. // 根据type属性中配置的类路径生成对应的事务工厂类
  4. String type = context.getStringAttribute("type");
  5. Properties props = context.getChildrenAsProperties();
  6. TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance();
  7. factory.setProperties(props);
  8. return factory;
  9. }
  10. throw new BuilderException("Environment declaration requires a TransactionFactory.");
  11. }

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/wsfwip 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。