(八)Mybatis持久化框架原理之不同Executor对比和Spring事务关系

文章目录

  • 1. SqlSession的差异
  • 2. Executor的差异
    • 2.1 SimpleExecutor流程说明
    • 2.2 ReuseExecutor流程说明
    • 2.3 BatchExecutor流程说明
  • 3. Mybatis事务
  • 4. Spring事务
  • 5. 总结

本篇文章主要是由一次批量插入数据而引起的思考与探究,在这篇文章中将会分析不同的Executor和SqlSession的实现原理差异,同时也会分析Mybatis和Spring的事务处理差异并比较他们之间的优先级与关系。

1. SqlSession的差异

Mybatis依赖于SqlSession来完成sql的调用,Mybatis和Spring集成时,SqlSession常用的类型有两种:

  1. DefaultSqlSession:如果通过SqlSessionFactory的openSession方法获取SqlSession,其生成的类型就是DefaultSqlSession。使用该类时需要开发者执行完业务逻辑后自行commit、rollback或close;
  2. SqlSessionTemplate:如果使用的是@Mapper或@MapperScan等方式通过Spring自动扫描注册的方式注入Mapper类,Mapper类则会被SqlSessionTemplate代理。在代理切面中调完方法后会自动commit、rollback或close,无需开发者关心介入。但在切面中实际使用的SqlSession类型依然是DefaultSqlSession。

总结: DefaultSqlSession是Mybatis操作Mapper方法的唯一入口,而SqlSessionTemplate则是使用代理方式包装了一层,在代理方法中使用DefaultSqlSession完成了commit、rollback和close。

所以不难理解为什么SqlSessionTemplate的commit、rollback和close三个方法未实现,调用则报错,因为其只提供代理的模板方法,不提供真实逻辑操作。

DefaultSqlSession类有个autoCommit属性,很多人会误以为这个属性是真正控制事务自动提交的,实际上不是,这个属性只会控制Mybatis的事务管理器是否调用commit、rollback方法,和事务的自动提交没有关系。 SqlSession基本每次事务调用都会生成一个新的。

2. Executor的差异

Mapper的增删改调用的都是Executor的doUpdate方法,查则调用的doQuery方法。

Mybati的Executor可供选择的有三种:

  1. SIMPLE:默认的执行器,实现类SimpleExecutor,其实现非常简单,从Datssource中获取Connection,再用Connection获取Statement实现类,最后执行增删改查;
  2. REUSE:实现类ReuseExecutor,在SIMPLE的基础上加入了Statement对象的缓存,如果对应的sql有Statement对象缓存则直接使用,避免了Statement对象的频繁创建销毁;
  3. BATCH:实现类BatchExecutor,增删改时会把Statement对象缓存起来,并添加到批处理中,在进行查询或commit时将会批量执并清空Statement缓存。

Executor的生命周期和SqlSession基本等同,其中的Transaction对象则是实例化Executor时由SqlSession设置进来的。

2.1 SimpleExecutor流程说明

SimpleExecutor执行sql流程

  • 调用时会从Connection中初始化Statement对象,而Connection会由Transaction对象维护;
  • 获取Statement之后直接调用执行方法,执行sql;
  • 最后关闭Statement对象。

2.2 ReuseExecutor流程说明

ReuseExecutor执行sql流程

  • 用sql判断Statement是否已生成, 如果已生成则使用缓存的Statement对象,并重新设置超时时间;未生成则流程和SimpleExecutor一致;
  • 获取Statement之后直接调用执行方法,执行sql;
  • 调用commit/rollback后会调用doFlushStatements方法清空Statement缓存,相当于只在一次事务中Statement会反复使用,这个步骤没在图中标注。

2.3 BatchExecutor流程说明

BatchExecutor增删改sql流程

  • 判断生成sql和MappedStatement对象和上次调用是否相同,如果相同则只会重新设置Statement对象的超时时间,并更新缓存;否则会重新实例化Statement
  • 调用时会从Connection中初始化Statement对象,而Connection会由Transaction对象维护;
  • 获取Statement后记录当前sql和MappedStatement对象,随后添加到缓存statementList中,并实例化BatchResult添加到缓存batchResultList;
  • 调用Statement的addBatch方法添加到批处理中;

注: BatchExecutor的增删改流程相当于只是在本地做了初始化操作并添加到了缓存中,没有实际调用数据库,因此如果是Mysql数据库,此时是拿不到自增主键的,因为还没有和数据库交互。

BatchExecutor的查询/commit流程图:

BatchExecutor查询/commit流程

  • 从statementList和batchResultList分别获取Statement和BatchResult对象;
  • 执行Statement对象的executeBatch方法执行批量操作;
  • 执行KeyGenerator生成主键并回填;
  • 保存批量操作结果;
  • 最后关闭Statement对象并清空缓存。

查询、commit或rollback时都会调用Executor的doFlushStatements方法,如果是rollback调用,则会直接返回空。只有查询和commit才会执行图片中的流程。

3. Mybatis事务

Mybatis的事务对象Transaction会在SqlSession中实例化Executor时由TransactionFactory实例化,并注入到Executor中。在Executor中实际操作的事务就是Transaction对象,因此Mybatis的事务实际提交与否和Transaction的实现类有关。

TransactionFactory和Transaction对象的对应关系表:

Transaction类型TransactionFactory类型是否默认设置autoCommitcommit/rollback备注说明
JdbcTransactionJdbcTransactionFactory可设置可操作非默认类型,需要开发者手动指定,可通过方法直接操作Connection对象
ManagedTransactionManagedTransactionFactory官方默认不可设置不可操作Mybatis未指定TransactionFactory时的默认类型,负责打开Connection连接,但不进行实际的commit/rollback操作
SpringManagedTransactionSpringManagedTransactionFactorySpring默认不可设置未在Spring事务可操作对接Spring时指定的默认类型,和JdbcTransaction类似,但是不能设置Connection对象的autoCommit属性,同时会判断Connection是否处于Spring的事务管理中,如果是则不会进行commit/rollback操作

由上面的表格内容可反推:Mybatis操作Datasource的Connection是由Transaction来完成的,常用的有两种:

  1. 由ManagedTransactionFactory生成的ManagedTransaction来完成,不能使用ManagedTransaction来控制connection的commit/rollback,只能直接使用Connection;
  2. 由SpringManagedTransactionFactory生成的SpringManagedTransaction来完成,会获取Datasource的自动提交属性,如果autocommit属性为true,则commit/rollback无效,如果autocommit为false,则commit/rollback生效。在Spring的事务管理中commit/rollback也无效。

注意: Druid的defaultAutoCommit属性默认是true,因此Druid会自动提交。

4. Spring事务

Spring事务通常有两种实现方式:

  1. 使用TransactionTemplate显式编程处理;
  2. 使用@Transactional切面进行处理。

使用TransactionTemplate的好处是不会受到任何约束,只要注入了TransactionTemplate,就可以直接使用,而不像@Transactional一样必须要求触发切面逻辑。其实现原理就是帮我们把try-catch块的提交回滚逻辑固定了,开发者只需要关注事务内部的业务逻辑即可。

使用这两种方式都会通过PlatformTransactionManager获取Connection,此时会把autocommit设置为false,因此事务不会自动提交。在切面即将结束时才会调用Connection的commit方法提交事务。

Spring的具体事务操作类是交给PlatformTransactionManager的实现类,如果使用的是Datasource,实现类一般是DataSourceTransactionManager,其实际管理的是由Datasource生成的Connection类,commit/rollback都是使用Connection对应的方法,autoCommit也是Connection的属性。

5. 总结

  1. 事务提交回滚与Datasource生成的Connection对象是否调用commit/rollback或autoCommit属性有关,第三方框架管理事务通过Connection对象操作;
  2. Spring的事务管理优先级大于Mybatis的事务管理,实际事务commit/rollback与否以Spring为主;
  3. Mybatis对接Spring使用的是SpringManagedTransaction,内部使用ThreadLocal完成Spring是否管理事务判断;
  4. 只通过Mybatis操作数据库事务,commit与否的优先级数据源autoCommit>Mybatis;
  5. Spring容器的事务通常由DataSourceTransactionManager管理实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快来速领限量免费亚马逊云科技助理级架构师(SAA)和云从业者50%半价考试券

前几天在上海5/29的亚马逊云科技Summit峰会里,小李哥在现场分享了AWS 13张认证大满贯的心得(图1),并且现场招募了自己的云师兄必过班(图2)。 本次必过班也为成员发放AWS SAA(助理级架构师)和云从业者(Cloud Practitioner)50%考试券…

AIGC作答《2024年高考作文|新课标I卷》能拿多少分?

AIGC作答《2024年高考作文|新课标I卷》能拿多少分? 一、前言二、题目三、作答 一、前言 如火如荼的2024年高考圆满落幕,在如此Happy的时刻,AIGC技术正以其前所未有的热度席卷全球。它不仅改变了我们获取信息的方式,也…

Element-UI入门

目录 1.什么是Element-UI 2.作用 3.版本历史 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.代码示例 7.未来展望 8.总结 1.什么是Element-UI Element-UI 是由饿了么前端团队开发的一套基于 Vue.js 的桌面端组件库。提供了一整套 UI 组件,使开发者能够快速构…

一步一学!如何通过SOLIDWORKS曲面放样绘制花瓶?

SOLIDWORKS中,我们对放样凸台的操作已经非常熟悉。现在,我们将进一步探索曲面菜单栏中的放样成型功能。 1、绘制草图 首先,同普通放样凸台建模相同,绘制放样轮廓及引导线段。 可通过创建基准面布置轮廓,利用穿透选项将…

144、二叉树的前序递归遍历

题解: 递归书写三要素: 1)确定递归函数的参数和返回值。要确定每次递归所要用到的参数以及需要返回的值 2)确定终止条件。操作系统也是用栈的方式实现递归,那么如果不写终止条件或者终止条件写的不对,都…

前端调用接口有参数正常显示返回值,但是打印是undefined

前端调用接口有参数正常显示返回值,但是打印是undefined 这种有几种情况,但总的来说是因为我们做了接口拦截器的处理 一、后端返回code值有误 比如新来的后端忘记传code了。(按照公司规范,一般都是200成功码) 或者网上…

IO-源码阅读 glibc 2.35

文章目录 参考缓存机制IO_FILE_PLUSfopenfopen_internal_IO_no_init_IO_old_init _IO_new_file_init_internal_IO_link_in _IO_new_file_fopen_IO_file_open fread_IO_fread_IO_sgetn_IO_doallocbuf_IO_file_doallocate_IO_file_stat_IO_setb __underflow_IO_new_file_underflo…

[Cloud Networking] Layer 2

文章目录 1. 什么是Mac Address?2. 如何查找MAC地址?3. 二层数据交换4. [Layer 2 Protocol](https://blog.csdn.net/settingsun1225/article/details/139552315) 1. 什么是Mac Address? MAC 地址是计算机的唯一48位硬件编码,嵌入到网卡中。 MAC地址也…

英特尔:AI落地,未来已来

引言 随着AI技术的发展和大模型的普及,人工智能正在逐渐渗透到我们的日常生活中。2023年5月底,我参加了台北的英特尔技术展,深入了解了英特尔在AI个人电脑领域的最新进展。本文将详细介绍英特尔的新一代移动处理器Lunar Lake,以及…

LabVIEW 与组态软件在自动化系统中的应用比较与选择

LabVIEW 确实在非标单机设备、测试和测量系统中有着广泛的应用,特别是在科研、教育、实验室和小型自动化设备中表现突出。然而,LabVIEW 也具备一定的扩展能力,可以用于更复杂和大型的自动化系统。以下是对 LabVIEW 与组态软件在不同应用场景中…

【C++】——Stack与Queue(含优先队列(详细解读)

前言 之前数据结构中是栈和队列,我们分别用的顺序表和链表去实现的,但是对于这里的栈和队列来说,他们是一种容器,更准确来说是一种容器适配器 ✨什么是容器适配器? 从他们的模板参数可以看出,第二个参数模…

Kafka 架构

1 整体架构 1.1 Zookeeper Zookeeper 是一个分布式协调服务,用于管理 Kafka 的元数据。它负责维护 Kafka 集群的配置信息、Broker 列表和分区的 Leader 信息。 Zookeeper 确保了 Kafka 集群的高可用性和可靠性。 但 Zookeeper 已经成为 Kafka 性能瓶颈,…

SmartDraw Suite Edition 画图软件画表格内存示意图的使用方法

总述:遇到不会画的,比如如何画一条虚线,先将 虚线 翻译成英文,然后在 help 中查询。 新建的时候选择如下: 一、选择 Forms->Blank Form 二、画表格: 三、画箭头:先选择1在选择2 四、编辑文…

ASUS华硕ROG幻14Air笔记本GA403UI(UI UV UU UJ)工厂模式原厂Windows11系统安装包,带MyASUS in WinRE重置还原

适用型号:GA403UI、GA403UV、GA403UU、GA403UJ 链接:https://pan.baidu.com/s/1tz8PZbYKakfvUoXafQPLIg?pwd1mtc 提取码:1mtc 华硕原装WIN11系统工厂包带有ASUS RECOVERY恢复功能、自带面部识别,声卡,显卡,网卡,蓝牙等所有驱动、出厂主题…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月9日,星期日

每天一分钟,知晓天下事! 2024年6月9日 星期日 农历五月初四 1、 人社部:个人养老金开户人数已超6000万,其中31岁至40岁的中高收入人群是开户、缴费和购买产品的主力军。 2、 医保局刊文:研究显示集采仿制药替代原研药…

VSC++: 民意调查比例法

void 民意调查比例法() {//缘由https://bbs.csdn.net/topics/396521294?page1#post-411408461从题目描述看:902/3~300.7,1498/5~299.6也就是大约求2个数的公约数,并使得这个公约数尽量求出最小误差?且商小于某值。int a 0, aa …

物理安全防护如何创新强化信息安全体系?

物理安全防护是信息安全体系的重要组成部分,它通过保护实体设施、设备和介质等,防止未授权访问、破坏、盗窃等行为,从而为信息系统提供基础的安全保障。要创新强化信息安全体系中的物理安全防护,可以从以下几个方面着手&#xff1…

VBA高级应用30例应用2实现在列表框内及列表框间实现数据拖动

《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…

Facebook:社交世界的引领者

导语 在当今数字化时代,Facebook已经成为了人们社交生活的重要一环。然而,除了成为社交媒体的象征外,它还在不断探索并领导着社交世界的新方向。 1. 社交平台的发展者 Facebook不仅仅是一个社交平台,更是社交方式的引领者。从其…

MathType7.8永久破解版下载 让数学学习变得简单有趣!

大家好,我是科技评论家。今天给大家推荐一款非常实用的数学公式编辑器——MathType 7.8!📱💰 在数字化时代,学术研究、教学和科研领域中的数学公式编辑需求越来越高。而MathType 7.8作为一个广受欢迎的数学公式编辑器&…