Mybatis 事务接口

当我们从数据源中得到一个可用的数据库连接之后,就可以开启一个数据库事务了,事务成功开启之后,我们才能修改数据库中的数据。

在修改完成之后,我们需要提交事务,完成整个事务内的全部修改操作,如果修改过程中出现异常,我们也可以回滚事务,放弃整个事务中的全部修改操作。

可见,控制事务在一个以数据库为基础的服务中,是一件非常重要的工作

为此,MyBatis 专门抽象出来一个 Transaction 接口。

Transaction 接口是 MyBatis 中对数据库事务的抽象,其中定义了提交事务、回滚事务,以及获取事务底层数据库连接的方法。

Transaction接口源码:

/**
 * Wraps a database connection.
 * Handles the connection lifecycle that comprises: its creation, preparation, commit/rollback and close.
 *
 * @author Clinton Begin
 */
public interface Transaction {
    // 获取该事务关联的数据库连接对象
    Connection getConnection() throws SQLException;

    // 提交当前事务
    void commit() throws SQLException;

    // 回滚当前事务
    void rollback() throws SQLException;

    // 关闭当前事务关联的底层数据库连接
    void close() throws SQLException;

    // 获取当前事务超时时间
    Integer getTimeout() throws SQLException;
}

JdbcTransaction、ManagedTransaction 是 MyBatis 自带的两个 Transaction 接口实现,这里也使用到了工厂方法模式,如下图所示:

在这里插入图片描述
TransactionFactory 是用于创建 Transaction 的工厂接口,其中最核心的方法是 newTransaction() 方法,它会根据数据库连接或数据源创建 Transaction 对象。

public interface TransactionFactory {
    // 对TransactionFactory对象进行配置,一般紧跟在TransactionFactory对象初始化之后,
    // 该方法主要是完成对TransactionFactory工厂的一些自定义配置
    default void setProperties(Properties props) {
    }

    // 在指定的数据库连接之上创建一个Transaction对象
    Transaction newTransaction(Connection conn);

    // 从指定数据源中获取数据库连接,并在此数据库连接之上创建一个关联的Transaction对象
    Transaction newTransaction(DataSource dataSource,
                               TransactionIsolationLevel level, boolean autoCommit);
}

JdbcTransactionFactoryManagedTransactionFactoryTransactionFactory 的两个实现类,分别用来创建 JdbcTransaction 对象和 ManagedTransaction 对象,具体实现比较简单,这里就不再展示,你若感兴趣的话可以参考源码进行学习。

接下来,我们看一下 JdbcTransaction 的实现,其中维护了事务关联的数据库连接以及数据源对象,同时还记录了事务自身的属性,例如,事务隔离级别和是否自动提交。

在构造函数中,JdbcTransaction 并没有立即初始化数据库连接(也就是 connection 字段),connection 字段会被延迟初始化,具体的初始化时机是在调用 getConnection() 方法时,通过dataSource.getConnection() 方法完成初始化。

在日常使用数据库事务的时候,我们最常用的操作就是提交和回滚事务,Transaction 接口将这两个操作抽象为 commit() 方法和 rollback() 方法。在 commit() 方法和 rollback() 方法中,JdbcTransaction 都是通过 java.sql.Connection 的同名方法实现事务的提交和回滚的。

ManagedTransaction 的实现相较于 JdbcTransaction 来说,有些许类似,也是依赖关联的 DataSource 获取数据库连接,但其 commit()、rollback() 方法都是空实现,事务的提交和回滚都是依靠容器管理的,这也是它被称为 ManagedTransaction 的原因。

另外,与 JdbcTransaction 不同的是,ManagedTransaction 会根据初始化时传入的 closeConnection 值确定是否在事务关闭时,同时关闭关联的数据库连接(即调用其 close() 方法)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分库分表之Mycat应用学习二

3 Mycat 概念与配置 官网 http://www.mycat.io/ Mycat 概要介绍 https://github.com/MyCATApache/Mycat-Server 入门指南 https://github.com/MyCATApache/Mycat-doc/tree/master/%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%973.1 Mycat 介绍与核心概念 3.1.1 基本介绍 历史&#x…

Tomcat和Servlet

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Tomcat是什么?1.1下载:1.2 tomcat是什么1.3启动服务器: 二.部署三、Servlet3.1创建项目3.2引入依赖pom.xml的所有代码 3…

一文讲清数据资产化之确权和估值

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年,数据资产化和入表已成为2023年的热门话题,随着2023年底国家数据局吹风《"数据要素x"三年行动计划(2024-2026年)》即将发布,这…

磁盘管理-------RAID卡

目录 一、RAID概述 二、常见类型 (一)RAID 0 (二)RAID 1 (三)RAID 5 (四)RAID 6 (五)RAID 10 (六)总结 三、创建RAID &…

lambda函数

文章目录 定义捕捉列表的形式一些更复杂的捕捉列表组合代码演示演示一演示二演示三演示四演示五演示六 lambda 函数,是C11中新引入的函数式编程语法,lambda函数可以被定义在类中成员函数内部,全局函数的内部。它是一个局部函数(即…

springboot定时执行某个任务

springboot定时执行某个任务 要定时执行的方法加上Schedule注解 括号内跟 cron表达式 “ 30 15 10 * * ?” 代表秒 分 时 日 月 周几 启动类上加上EnableScheduling 注释

第二部分 离散型随机变量

目录 求分布律里的未知数 例1 例2 根据X的分布律写Y的分布律 例3 根据(X,Y)的分布律写Z的分布律 例4 根据(X,Y)的分布律写边缘分布律 例5 X与Y相互独立时的联合分布律 例6 根据分布律求期望、方差 例7 求分布律里的未知数 例1 已知X的分布律为 X-202P0.40.3k ,试求k 解 0.40…

【网络奇遇记】揭秘计算机网络的性能指标:时延带宽积|往返时间|利用率|丢包率

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋上期回顾一. 时延带宽积二. 往返时间三. 利用率四. 丢包率📝结语 &#x1…

【用户增长】引言:浅析游戏运营用户增长概念

1 游戏发行运营中的主要职能: ​ 一、发行运营通识l 运营介绍:职能分工、发行运营流程、职业发展能力及要求l 品类认知:行业品类布局、品类用户画像、运营节奏及特性,包含不同品类核心打法及长线运营思路l 海外运营:海…

linux安装python

文章目录 前言一、下载安装包二、安装1.安装依赖2.解压3.安装4.软链接5.验证 总结 前言 本篇文章介绍linux环境下安装python。 一、下载安装包 下载地址:官方网站 我们以最新的标准版为例 二、安装 1.安装依赖 yum -y install openssl-devel ncurses-devel li…

什么是AI PC,又有哪些产品

最近一段时间,AI PC成为一个流行词。Intel在发布Core Ultra处理器的时候,直接使用了AI PC这个词语,而各大厂商发布相应的笔记本产品时,也使用了AI Ready的宣传词。而在Intel之前,AMD在发布自己的新一代APU的时候&#…

数据结构和算法-B树的插入和删除

文章目录 B树的插入小结B树的删除小结 B树的插入 首先将根节点的关键字个数填满,填满后再分开成树 分开的规则 此时插入90,从根节点依次查找,然后插入到终端节点的关键字中 插入同上,注意此时在终端节点插入要符合终端节点的大…

蓝桥杯嵌入式KEY

1.按键原理图 2.按键GPIO引脚设置成输入,上拉模式 3.设置TIM4时钟源为外部时钟源 PSC为80-1 Period为10000-1 打开NVIC 中断时间为10ms 4.在bsp文件中添加interrupt.c文件 5.按键单击代码 6.长按键 7.按键过程和显示过程

缺少/run/haproxy目录,haproxy服务启动失败

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 问题描述: 搭建haproxy的机器,因出现故障重启了,然后发现haproxy服务出现异常。重新启动hap…

数据库最小函数依赖求法 附相关习题及解析

首先我们给出最小函数依赖的定义 如果函数依赖集F满足下列条件,则称F为最小函数依赖集或最小覆盖。 ① F中的任何一个函数依赖的右部仅含有一个属性; ② F中不存在这样一个函数依赖X→A,使得F与F-{X→A}等价; ③ F中不存在这样一…

【Linux专区】如何配置新服务器 | 添加普通用户到sudoers | 配置vim | git免账号密码pull push

💞💞欢迎来到 Claffic 的博客💞💞 👉 专栏:《Linux专区》👈 💬前言: 时隔131天,你的好友Claffic重新发文了!(✿◕‿◕✿) 上期已经带大家白嫖了阿…

Unity坦克大战开发全流程——游戏场景——敌人——移动的敌人

游戏场景——敌人——移动的敌人 制作预制体 将坦克拖拽至场景中进行设置 写代码 让坦克在两点之间不停移动 随机坐标函数 然后在start()中调用即可 坦克要一直盯着玩家 当小于一定距离时,攻击玩家 重写开火逻辑 注意还要将其tag改成Monster! 当敌人死…

鲲志说:向我乘风破浪,好事多磨的2023致敬!(感恩有礼,感谢有你)

伴随着2023最后一个工作日的结束,也终于要给一年的工作划上一个结尾了,当然,也要给自己一个交代,给自己一个年度总结 2023年,大的挫折也是有的,但我相信好事多磨,总的来说是事业型的一年&#x…

前端--基础 目录文件夹和根目录 VScode打开目录文件夹

目录 目录文件夹和根目录 : 目录文件夹 : 根目录 : VScode 打开目录文件夹 : VScode 打开文件夹 : 拖拽目录文件夹 : 目录文件夹和根目录 : 我们都清楚,在实际的工作中会…

考研后SpringBoot复习1

考研后SpringBoot复习 Hello World入门 复习的版本为SpringBoot2的版本 创建maven项目 在pom文件中导入SpringBoot的依赖同时引入web开发的启动器 <!--声明springboot父项目--><parent><groupId>org.springframework.boot</groupId><artifactId>…