#yyds干货盘点# mybatis源码解读(transaction包(事务管理功能))

莫道桑榆晚,为霞尚满天。这篇文章主要讲述#yyds干货盘点# mybatis源码解读:transaction包(事务管理功能)相关的知识,希望能为你提供帮助。
mybatis源码解读:transaction包(事务管理功能)
mybatis的transaction包是负责进行事务管理的包,该包内包含2个子包:jdbc子包中包含基于jdbc进行事务管理的类,managed子包中包含基于容器进行事务管理的类。1.事务概述
事务即数据库事务,是数据库执行过程中的一个逻辑单元。事务有以下4个特性:
    Atomicity(原子性):事务必须被作为一个整体执行,要么全部执行, 要么全部不执行。不允许只执行其中的一部分。
    Consistency(一致性):事务应该保证数据库从一致性状态转换到另一个一致性状态。一致性状态是指数据库中数据的完整性约束。
    Isolation(隔离性):多个事务并发执行时, 事务不会互相干扰。
    Durability(持久性):一旦事务提交,则其所做的修改就会永久保存到数据库中。
2.事务接口及工厂
    整个transaction包采用了工厂方法模式实现,TransactionFactory是所有事务工厂的接口。

public interface TransactionFactory
/**
* 配置工厂的属性
* @param props 工厂的属性
*/
default void setProperties(Properties props)
// NOP


/**
* 从给定的连接中获取一个事务
* @param conn 给定的连接
* @return 获取的事务对象
*/
Transaction newTransaction(Connection conn);

/**
* 从给定的数据源中获取事务,并对事务进行一些配置
* @param dataSource 数据源
* @param level 数据隔离级别
* @param autoCommit 是否自动提交事务
* @return 获取的事务对象
*/
Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);


TransactionFactory接口与Transaction接口都有2套实现,分别在jdbc包和managed包中。


3.jdbc事务

jdbc包中存放的是实现jdbc事务的JdbcTransaction类及其对应的工厂类,

【#yyds干货盘点# mybatis源码解读(transaction包(事务管理功能))】JdbcTransaction类是jdbc事务的管理类,具体的事务操作是由JdbcTransaction类直接调用Connection类提供的事务方法来完成的。

public class JdbcTransaction implements Transaction

private static final Log log = LogFactory.getLog(JdbcTransaction.class);

// 数据库连接
protected Connection connection;
// 数据源
protected DataSource dataSource;
// 事务隔离级别
protected TransactionIsolationLevel level;
// 是否自动提交事务
protected boolean autoCommit;

public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit)
dataSource = ds;
level = desiredLevel;
autoCommit = desiredAutoCommit;

/**
* 提交事务
* @throws SQLException
*/
@Override
public void commit() throws SQLException
// 连接存在且不会自动提交事务
if (connection != null & & !connection.getAutoCommit())
if (log.isDebugEnabled())
log.debug("Committing JDBC Connection [" + connection + "]");

// 调用connection对象的方法提交事务
connection.commit();


/**
* 回滚事务
* @throws SQLException
*/
@Override
public void rollback() throws SQLException
if (connection != null & & !connection.getAutoCommit())
if (log.isDebugEnabled())
log.debug("Rolling back JDBC Connection [" + connection + "]");

connection.rollback();






    推荐阅读