聊聊Mybatis的事务模块
聊聊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的提交和回滚是空,通过容器来管理事务的提交和回滚
- 点赞
- 收藏
- 关注作者
评论(0)