Mybatis事务模块有哪些操作细节可以探讨?

2026-06-10 02:581阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计578个文字,预计阅读时间需要3分钟。

Mybatis事务模块有哪些操作细节可以探讨?

Mybatis 事务模块:Mybatis 定义了自定义事务接口来实现事务管理,这里同样使用了工厂模式。工厂模式中的产品是 `Transaction` 接口,它包含一个方法 `getConnection()` 用于获取数据库连接。接口定义如下:

javapublic interface Transaction { Connection getConnection() throws SQLException;}

@[TOC]

聊聊Mybatis的事务模块

mybatis定义了自己的事务接口来实现事务,这里同样也使用了工厂模式

工厂模式中的产品

Transaction接口:

public interface Transaction { Connection getConnection() throws SQLException; void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException; Integer getTimeout() throws SQLException; }

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

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是通过容器来管理事务,所以他的事务提交和回滚的方法都是null

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

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

Mybatis事务模块有哪些操作细节可以探讨?

@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的提交和回滚是空,通过容器来管理事务的提交和回滚

本文共计578个文字,预计阅读时间需要3分钟。

Mybatis事务模块有哪些操作细节可以探讨?

Mybatis 事务模块:Mybatis 定义了自定义事务接口来实现事务管理,这里同样使用了工厂模式。工厂模式中的产品是 `Transaction` 接口,它包含一个方法 `getConnection()` 用于获取数据库连接。接口定义如下:

javapublic interface Transaction { Connection getConnection() throws SQLException;}

@[TOC]

聊聊Mybatis的事务模块

mybatis定义了自己的事务接口来实现事务,这里同样也使用了工厂模式

工厂模式中的产品

Transaction接口:

public interface Transaction { Connection getConnection() throws SQLException; void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException; Integer getTimeout() throws SQLException; }

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

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是通过容器来管理事务,所以他的事务提交和回滚的方法都是null

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

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

Mybatis事务模块有哪些操作细节可以探讨?

@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的提交和回滚是空,通过容器来管理事务的提交和回滚