莫道桑榆晚,为霞尚满天。这篇文章主要讲述#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();
推荐阅读
- SpringBoot | 3.2 整合MyBatis #yyds干货盘点#
- Linux中Shell重定向
- #私藏项目实操分享#专为初学者打造—Spring框架学习笔记
- #yyds干货盘点# SpringBoot 发送邮箱验证码(HTML模板)
- #yyds干货盘点#Python图像处理,cv2模块,OpenCV实现人脸检测
- #指尖人生#面向对象设计常用的设计模式-桥接模式
- JDK、JRE和JVM之间有什么区别()
- set,multiset,unordered_set,unordered_multiset之间的差异
- 虚拟电路和数据报网络之间有什么差异()