MyBatis事务管理机制

搞懂 MyBatis 的事务管理机制 事务是指要么全部执行成功,要么全部回滚的一组操作。在数据库中,一般使用 ACID 规则来约束事务,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。在 MyBatis 中,也遵循了这一规则。MyBatis中的事务是指一系列数据库操作,这些操作要么全部执行成功,要么全部执行失败。如果操作过程中发生错误,所有对数据库的修改都将被回滚,即还原到最初状态。事务是确保数据一致性和完整性的关键机制之一。 阅读详情

MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面。本文将从事务的分类、配置和实现分析MyBatis的事务管理的实现机制。

MyBatis事务的分类

对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:其接口定义如下:

 

MyBatis的事务管理分为两种形式:

1、使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等

2、使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理

 

MyBatis事务的配置

在使用MyBatis时,一般会在MyBatisXML配置文件中定义类似如下的信息:

 

<environment>节点定义了连接某个数据库的信息,其子节点<transactionManager> 的type 会决定我们用什么类型的事务管理机制。

MyBatis事务的创建

MyBatis事务的创建是交给TransactionFactory 事务工厂来创建的,如果我们将<transactionManager>的type 配置为"JDBC",那么,在MyBatis初始化解析<environment>节点时,会根据type="JDBC"创建一个JdbcTransactionFactory工厂,其源码如下:


 
/** * 解析<transactionManager>节点,创建对应的TransactionFactory * @param context * @return * @throws Exception */ private TransactionFactory transactionManagerElement(XNode context) throws Exception { if (context != null) { String type = context.getStringAttribute("type"); Properties props = context.getChildrenAsProperties(); /* 在Configuration初始化的时候,会通过以下语句,给JDBC和MANAGED对应的工厂类 typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class); typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class); 下述的resolveClass(type).newInstance()会创建对应的工厂实例 */ TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance(); factory.setProperties(props); return factory; } throw new BuilderException("Environment declaration requires a TransactionFactory."); } 

上述代码所示,如果type = "JDBC",则MyBatis会创建一个JdbcTransactionFactory.class 实例;如果type="MANAGED",则MyBatis会创建一个MangedTransactionFactory.class实例。

MyBatis对<transactionManager>节点的解析会生成 TransactionFactory实例;而对<dataSource>解析会生成datasouce实例。作为<environment>节点,会根据TransactionFactory和DataSource实例创建一个Environment对象,代码如下所示:


 
private void environmentsElement(XNode context) throws Exception { if (context != null) { if (environment == null) { environment = context.getStringAttribute("default"); } for (XNode child : context.getChildren()) { String id = child.getStringAttribute("id"); //是和默认的环境相同时,解析之 if (isSpecifiedEnvironment(id)) { //1.解析<transactionManager>节点,决定创建什么类型的TransactionFactory TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager")); //2. 创建dataSource DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource")); DataSource dataSource = dsFactory.getDataSource(); //3. 使用了Environment内置的构造器Builder,传递id 事务工厂TransactionFactory和数据源DataSource Environment.Builder environmentBuilder = new Environment.Builder(id) .transactionFactory(txFactory) .dataSource(dataSource); configuration.setEnvironment(environmentBuilder.build()); } } } } 

Environment表示着一个数据库的连接,生成后的Environment对象会被设置到Configuration实例中,以供后续的使用。

 

通过事务工厂TransactionFactory很容易获取到Transaction对象实例。我们以JdbcTransaction为例,看一下JdbcTransactionFactory是怎样生成JdbcTransaction的,代码如下:


 
public class JdbcTransactionFactory implements TransactionFactory { public void setProperties(Properties props) { } /** * 根据给定的数据库连接Connection创建Transaction * @param conn Existing database connection * @return */ public Transaction newTransaction(Connection conn) { return new JdbcTransaction(conn); } /** * 根据DataSource、隔离级别和是否自动提交创建Transacion * * @param ds * @param level Desired isolation level * @param autoCommit Desired autocommit * @return */ public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) { return new JdbcTransaction(ds, level, autoCommit); } } 

如上说是,JdbcTransactionFactory会创建JDBC类型的Transaction,即JdbcTransaction。类似地,ManagedTransactionFactory也会创建ManagedTransaction。下面分别深入JdbcTranaction 和ManagedTransaction,看它们到底是怎样实现事务管理的。

JdbcTransaction

JdbcTransaction直接使用JDBC的提交和回滚事务管理机制 。它依赖与从dataSource中取得的连接connection 来管理transaction 的作用域,connection对象的获取被延迟到调用getConnection()方法。如果autocommit设置为on,开启状态的话,它会忽略commit和rollback。

直观地讲,就是JdbcTransaction是使用的java.sql.Connection 上的commit和rollback功能,JdbcTransaction只是相当于对java.sql.Connection事务处理进行了一次包装(wrapper),Transaction的事务管理都是通过java.sql.Connection实现的。

ManagedTransaction

ManagedTransaction让容器来管理事务Transaction的整个生命周期,意思就是说,使用ManagedTransaction的commit和rollback功能不会对事务有任何的影响,它什么都不会做,它将事务管理的权利移交给了容器来实现。

学习笔记之——Event Camera(事件相机)调研 概述 Event Camera是一种bio-inspired sensor,对应的领域为bio-inspired vision。对于传统的相机,从某种程度上,是捕获一个静态/静止的空间,而Event Camera的目的是:敏感地捕捉运动的物体。 对于传统RGB-camera,相机传回的信息是同步的,所谓同步,就是在某一时刻t,相机会进行曝光,把这一时刻所有的像素填在一个矩阵里回传,一张照片就诞生了。一张照片上所有的像素都对应着同一时刻。至于视频,不过是很多帧的图片,相邻图片间的时间间隔... 阅读详情

相关推荐

本地部署ComfyUI:开源AI生图与视频生成完整实战指南

在生成式AI应用快速普及的今天,云端工具常受制于排队、积分和素材管理等问题,而本地化部署正成为开发者与创作者的高效替代方案。其核心思路是基于开源工作流引擎,将图像生成、视频生成与后期处理整合到同一套可离线运行的系统中。ComfyUI作为当前最受关注的节点式工作流平台,凭借灵活的模块组合和强大的自定义能力,降低了从图像模型调用到视频扩展的工程门槛。本文从环境配置与依赖安装入手,系统讲解如何部署ComfyUI、加载Checkpoint模型、跑通文生图基础流程,再通过自定义节点接入视频生成能力,同时介绍API批量

weixin_30985047的博客 555

Mybatis事务管理

读已提交`级别:事务只能读取其他事务已经提交的内容,相当于直接从数据中读取数据,这样就可以避免**脏读**问题了,虽然它避免了脏读问题,但是如果事件B修改并提交了数据,那么实际上事务A之前读取到的数据依然不是最新的数据,直接导致两次读取的数据不一致,这种现象称为**虚读**也可以称为**不可重复读**比如,两个人同时报名一个活动,两个报名的事务同时在进行,但是他们一开始读取到的人数都是5,而这时,它们都会认为报名成功后人数应该变成6,而正常情况下应该是7,因此这个时候就发生了数据的**幻读**现象。

weixin_51992178的博客 1409

4.图像sensor的特性和驱动解析

例子:sensor驱动自己提供操作曝光时间的函数和获取曝光时间的函数,然后将这个函数注册到ISP库和3A算法库,3A算法库根据外部光照强度计算出一个Sensor曝光时间的设置值,ISP库得到这个设置值,然后通过Sensor之前注册的回调函数,把这个值设置到Sensor的硬件寄存器中去,实现整个过程。是为 ISP 配置正确的输入时序。(1)修改驱动源码(sambashar\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor\ar0130)

weixin_53762042的博客 3566

MyBatis事务管理

MyBatis 提供了多种方式来管理事务,既可以使用 MyBatis 自身的事务管理机制,也可以将其与 Spring 等框架集成进行统一管理。对于简单的应用,可以使用 MyBatis 自带的 JDBC 事务管理器,而对于复杂的应用,尤其是涉及多层和多数据源的场景,推荐使用 Spring 的声明式事务管理来简化事务处理逻辑。通过 Spring 管理事务,可以简化事务控制,利用 Spring 的声明式事务管理机制。实现分布式事务管理。:事务开始后看到的数据是一致的,即使其他事务提交了数据,防止不可重复读。

Flying_Fish_roe的博客 1550

深入解析Android Thermal框架:从应用层到驱动层的温度管理机制

本文深入解析Android Thermal框架的温度管理机制,从应用层到驱动层详细介绍了温度监测、热状态评估和降温策略执行的全过程。通过分层架构解析和关键组件交互,帮助开发者理解Android设备如何实现高效的温度控制,确保硬件安全并优化性能。

weixin_29303701的博客 256

【实战指南】DBeaver EE Windows版高效破解与配置全解析

本文详细解析了DBeaver EE Windows版的高效破解与配置方法,涵盖Java环境配置、破解包部署、配置文件修改等关键步骤,并提供了性能优化和数据库连接的最佳实践。适用于需要解锁企业版高级功能的数据库开发人员,帮助提升工作效率。

weixin_28837817的博客 1897

【MyBatis】搞懂 MyBatis 的事务管理机制

MyBatis 是一款优秀的持久层框架,相信很多 Java 后端开发人员对它都不会陌生。在实际项目开发中,事务管理是非常重要的一环,而 MyBatis 也为我们提供了便捷的事务管理机制。事务概述MyBatis 实现事务的方式事务实现源码分析事务是指要么全部执行成功,要么全部回滚的一组操作。在数据库中,一般使用 ACID规则来约束事务,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。在。

DreamSun的博客 7508

银河麒麟V10系统下,手把手解决Ollama安装报错‘GLIBCXX_3.4.25 not found’

本文详细介绍了在银河麒麟V10系统下解决Ollama安装报错‘GLIBCXX_3.4.25 not found’的实战指南。通过隔离编译新版libstdc++、环境变量引导和服务化封装等安全方案,确保在不破坏系统稳定性的前提下顺利运行Ollama,适用于国产操作系统与AI工具的兼容性需求。

weixin_42556197的博客 482

MyBatis源码系列之七:MyBatis的事务管理

欢迎来到MyBatis源码系列的第七篇文章。在前面的文章中,我们深入探讨了MyBatis的总览和环境准备,配置文件的解析过程,SqlSessionFactory的创建,SqlSession的工作原理,以及执行器Executor的实现细节。本篇文章将继续深入研究MyBatis的事务管理机制。

Dingxiaowei77的专栏 646

Android 导出aar 用于Unity 百度语音唤醒

AndroidStudio版本下载地址Android Studio Arctic Fox Unity版本2021.3.26f1c1 新建AndroidStudio工程 新建module 这里注意一下,网上很多教程说要注意包名要和unity一样,但是测试下来,不一样也可以的 在新建的module里添加这两个jar包,并点击右键add as library 导入jniLibs 右键创建这几个package 代码就安装这个大佬的写参考代码 需要注意的的是在WakeupListener脚本里U

weixin_38777563的博客 633

【芯片设计- RTL 数字逻辑设计入门 番外篇6 -- 术语 Tile 介绍】

在系统级芯片(System on Chip, SoC)设计中,“tile” 是一个可以指代不同概念的术语,但通常它指的是芯片上的一个独立的功能单元或核心。一个 tile 可以包含一个或多个处理器核心、缓存、内存控制器、输入输出设备、外设接口或其他功能模块。在 SoC 上,多个 tile 可以被组合和连接起来,以形成一个完整的系统。

CodingCos的博客 3064

深度解析mybatis事务管理机制

MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面。比如:银行账户转账,从A账户向B账户转账10000,需要执行两条update语句以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败。要想保证以上两条DML语句同时成功或者同时失败,那么就需要使用数据库的“事务机制”。

WJaLYL的博客 1126

RT-Thread Studio 使用笔记(七)| 配合STM32CubeMX添加裸机驱动(以ADC为例)

1. 配置STM32CubeMX 2. 复制stm32xxxx_hal_msp.c文件 将 CubeMx 生成的代码 stm32f7xx_hal_msp.c 函数复制到 RT-Thread Studio 生成的工程中,并参与工程编译: 由于我们并没有使用 CubeMx 生成的工程,所以这里需要将 stm32f7xx_hal_msp.c 文件中 #include “main.h” 替换为 #i...

Mculover666的博客(嵌入式) 9622

MyBatis事务管理机制详解

数据库事务的定义就是将多个执行单元看作一个整体,要么全部执行成功,要么执行失败。事务具有ACID属性,事务的隔离级别有读未提交,读提交,可重复读,串行等等,这些涉及到数据库的知识我们在此不做展开,希望同学们有这方面的基础。

深入Java世界:探索编程之美与技术深度 1253

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

回滚机制_MyBatis事务管理机制

MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面。本文将从事务的分类、配置和实现分析MyBatis的事务管理的实现机制。MyBatis事务的分类对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:其接口定义如下:MyBati...

weixin_26765287的博客 586

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

《深入理解Mybatis原理》MyBatis事务管理机制

对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等。使用MANAGED的事务管理机制。

SevenCoding的博客 1109

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

《深入理解Mybatis原理》MyBatis事务管理机制 !

对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等。使用MANAGED的事务管理机制。

mifffy_java的博客 1083

Mybatis事务管理机制和缓存机制

文章目录mybatis事务管理机制缓存机制一级缓存(sqlsession关闭之后,记录清空)二级缓存(sqlsession清空记录,重新创建的sqlsession还会读取二级缓存中数据) mybatis事务管理机制 事务特性 事务配置 缓存机制 一级缓存(sqlsession关闭之后,记录清空) 默认开启 UserMapper.xml <?xml version="1.0" encod...

qq_32754539的博客 289

深入探索MyBatis的事务管理机制:从基础到高级应用

MyBatis提供了灵活且强大的事务管理机制,通过SqlSession对象和Spring框架的支持,你可以轻松实现高效的事务管理。本文从基础概念到高级应用,详细介绍了MyBatis事务管理的各个方面,并提供了代码示例和最佳实践。希望这篇文章能帮助你更好地理解和使用MyBatis的事务管理机制,让你的Java开发之旅更加顺畅!

xycxycooo的博客 1277

Mybatis教程 | 第七篇:Mybatis的事务管理和缓存机制

Mybatis的事务管理 1、事务的概念 在我们开发过程中,几乎每个业务逻辑都离不开对数据库的操作。那么对数据的的单个操作(单个CRUD)或者多个操作(多个CRUD)绑定在一起,就称为事务。 单个事务是一个最小的逻辑执行单元,整个事务不能分开执行,要么同时成功,要么同时失败。(PS:初次接触事务概念的朋友,也许会难以理解最小逻辑执行单元,反正当初我是误解了,误解的地方还真有点描述不出来,原谅...

好记性不如烂笔头 587
上一篇: Spring boot学习(六)Spring boot实现AOP记录操作日志
下一篇: SpringMVC-方法四种类型返回值总结,你用过几种?
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值