当前位置: 首页 > news >正文

MySQL数据库之——事务(Transaction)详解

一、MySQL 事务定义

        MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在银行管理系统中,用户张三向李四账户转账的操作,账户转账是一个完整的业务,最小的单元,不可再分,这样,完成转账操作的这些SQL语句之和就构成一个事务!

        总的来说,

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务通常用来管理 insert(增)、update(改)、delete(删) 语句。

二、事务满足四个条件

事务是必须满足4个条件原子性、一致性、隔离性、持久性。

        1.原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。

        例如:当事务在执行过程中发生错误时,已经被修改过的数据会回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

        2.持久性:当一个事务处理结束后,会进行commit提交操作,将处理后的数据从内存提交到磁盘中,保证数据的持久化存储。

        3.一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则。

        4.隔离性:事务通常都是并发的,不同事务会同时对数据库中的数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

        事务的隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

三、MySQL中事务管理的相关SQL指令:

  • START TRANSACTION :显式地开启一个事务;

  • COMMIT :事务提交,将事务更新后的数据从内存保存进磁盘中,实现数据的持久保存;

  • ROLLBACK :事务回滚,结束当前正在进行的事务,并将已经修改但未提交的数据回滚到事务开始之前的状态;

  • SAVEPOINT 【标记点】该指令允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

  • RELEASE SAVEPOINT 【标记点】 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

  • ROLLBACK TO 【标记点】把事务回滚到标记点;

  • SET TRANSACTION 用来设置事务的隔离级别。

    InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED(读未提交)、READ COMMITTED(读提交)、REPEATABLE READ(可重复读) 和 SERIALIZABLE(串行化)。

其中我们最常用的两条语句就是commit事务提交和rollback事务回滚。

四、在MySQL中演示,简单事务提交与回滚

业务情形:id为1的用户(张三) 给 id为2的用户(李四) 转账100元

①首先有一张bank的表,所有用户的钱初始值都是200元

②在不开启事物的情况下

1.模拟转张操作(SQL代码)

#不开启事物的情况下:1.执行转张操作所需要的SQL语句
update bank SET money = money-100 WHERE id = 1;
update bank SET money = money+100 WHERE id = 2;

若未出现异常情况,该项转账业务成功执行;两个用户的钱发生正确变化;

2.模拟中途出现异常(SQL代码)

#首先,自定义一个异常叫money_error
DECLARE money_error CONDITION FOR 1148;2.模拟中途出现异常,转张执行失败
update bank SET money = money-100 WHERE id = 1;
money_error;
update bank SET money = money+100 WHERE id = 2;

如图所示,若中途出现异常,执行失败:发现数据只更改了一半,张三的钱少了,但收款方李四账户并没有多出100元

 

        像上述这种情况,在实际项目开发中肯定是不允许出现的,因此我们可以借助Mysql数据库中的事务管理,将转账这两条SQL语句封装成一条事务,使其具有不可分割性(原子性);

③使用MySql中事务管理,来模拟转账操作

  • 当开启事务管理后,若执行过程中遇到异常,那么被修改但未提交的数据则会回滚到初始值;

执行之前,两人都是200元;

1.模拟开启事务后执行转账操作

#开启事物管理---执行成功则提交到磁盘
start TRANSACTION;
update bank SET money = money-100 WHERE id = 1;
update bank SET money = money+100 WHERE id = 2;
commit;

当事务正常执行并提交(commit),两人的钱会发生对应的变化 

 

2.模拟转账操作执行过程中出现异常

#定义一个异常叫money_error
DECLARE money_error CONDITION FOR 1148;#开启事物管理---执行失败则会回滚到初始数据
start TRANSACTION;
update bank SET money = money-100 WHERE id = 1;
money_error;
update bank SET money = money+100 WHERE id = 2;
ROLLBACK;

当转账遇到异常时,进行事务回滚,两人的金额仍然是200元。

        通过以上的简单模拟,我们已经对事务有了一定了解;接下来让我们学习,如何在MyBatis中进行事务管理操作。

五、事务管理与MyBatis结合

前提:已经构建好MyBatis框架

①.首先我们创建一个用户表,用户初始余额都为200元

②编写转账操作对应SQL语句:

<!--  转账事物管理  --><!--  汇款人  --><update id="outMoney" parameterType="List" >update user set money = money-#{money} where id = #{id}</update><!--  收款人  --><update id="acceptMoney" parameterType="List" >update user set money = money+#{money} where id = #{id}</update>

③然后编写Dao层接口方法:

//事物管理测试://对于mapper的Dao层的接口,传入的参数有多个时必须使用@param进行标识,//汇款public void acceptMoney(@Param("money") float money,@Param("userId") Integer id);//收款public void outMoney(@Param("money")float money,@Param("userId")Integer id);

④最后是,转账业务的测试代码:

  • 无异常情况的情况下:
//首先是正常执行转账操作,没有异常时
public void transfer(){try{System.out.println("转账前:");mapper.findAll();//执行转张mapper.outMoney(100,1);mapper.acceptMoney(100,2);session.commit();//当未捕捉到任何异常时,提交事务System.out.println("转账后:");mapper.findAll();}catch (Exception e){e.printStackTrace();session.rollback();//一旦捕捉到异常,则将事务回滚}finally {if (session != null) {session.close();//最后释放资源}}}
  • 模拟一个转账异常

 @Testpublic void transfer(){try{System.out.println("转账前:");findAll();//执行转张mapper.outMoney(100,1);int x = 1/0; //模拟一个异常mapper.acceptMoney(100,2);session.commit();//当未捕捉到任何异常时,提交事务System.out.println("转账后:");findAll();}catch (Exception e){e.printStackTrace();session.rollback();//一旦捕捉到异常,则将事务回滚}finally {if (session != null) {//最后释放资源session.close();}}

⑤测试运行结果

  • 正常执行转张操作:

      

  • 若转账中途出现异常:

         当出现异常,转张操作会被中断,然后事务回滚;我们查看数据库,每个人的前仍为初始值200元。

        以上就是事务在实际开发过程中的应用,本篇文章是我在学习完数据库事务管理后的总结与笔记,如果大家喜欢,请多多点赞;若有错误,欢迎指正;

拓展:多事务之间并发可能会导致的问题:     

①脏读:

       ②不可重复读

                          
           ③幻读         

   

参考文章:

MySQL——事务(Transaction)详解_mysql事务-CSDN博客

MySQL 事务 | 菜鸟教程

相关文章:

MySQL数据库之——事务(Transaction)详解

一、MySQL 事务定义 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在银行管理系统中&#xff0c;用户张三向李四账户转账的操作&#xff0c;账户转账是一个完整的业务&#xff0c;最小的单元&#xff0c;不可再分&#xff0c;这样&#xff0c…...

LabVIEW提高开发效率技巧----事件日志记录

在LabVIEW开发中&#xff0c;集成事件日志记录系统是提升程序调试效率和确保系统运行稳定的关键步骤。通过记录关键操作和异常事件&#xff0c;开发人员可以快速定位问题、优化程序性能&#xff0c;并确保系统的稳定性和可靠性。 1. 事件日志的作用 事件日志是指在程序运行过…...

整合XXL-Job任务调度平台

创建数据库 tables_xxl_job.sql 引入依赖 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.0</version> </dependency>编写配置文件 server:port: 8081xxl:job:admin:# 这…...

hi3536上ffmpeg带rtmp移植

1.下载ffmpeg-4.1.3版本源码包 用下面的脚本进行configure&#xff1a; ./configure \--target-oslinux \--prefix./libs/ \--enable-cross-compile \--archarm \--ccarm-hisiv500-linux-gcc \--cross-prefixarm-hisiv500-linux- \--nmarm-hisiv500-linux-nm \--enable-share…...

在PHP中,读取大文件

在PHP中&#xff0c;读取大文件可以采用以下几种方法&#xff1a; 1. 使用fopen和fread函数&#xff1a;这是最基本的文件读取方法&#xff0c;可以逐行读取大文件。首先使用fopen函数打开文件&#xff0c;然后使用fread函数指定读取的字节数&#xff0c;逐行读取文件内容并进…...

N-gram详解

文章目录 一、什么是N-gram?二、N-gram的种类三、优缺点PS&#xff1a;补充 一、什么是N-gram? 在自然语言处理中&#xff0c;n-gram是一种重要的文本表示方法。n-gram是指给定文本中连续的n个项目&#xff0c;这些项目可以是声音、单词、字符或者像素等。n-gram模型常常用于…...

电路中的电源轨及地的区别和处理

电源轨 VCC 通常代指正电源供电轨。在大多数数字和模拟电路中&#xff0c;VCC代表电路中的正电源端。VCC提供电路所需的正电压&#xff0c;通常是用来驱动晶体管、集成电路。 VDD 相对与VCC的正电源供应&#xff0c;VDD更常用于表示数字电路中的正电源引脚。VDD常见于集成电…...

k8s可以部署私有云吗?私有云部署全攻略

k8s可以部署私有云吗&#xff1f;K8S可以部署私有云。Kubernetes是一个开源的容器编排引擎&#xff0c;能够自动化容器的部署、扩展和管理&#xff0c;使得应用可以在各种环境中高效运行。通过使用Kubernetes&#xff0c;企业可以在自己的数据中心或私有云环境中搭建和管理容器…...

编辑器资源管理器

解释 EditorResMgr 是一个用于在 Unity 编辑器中加载资源的管理器。它通过 Unity 编辑器的 API (AssetDatabase) 进行资源加载&#xff0c;但仅在开发和编辑模式下可用&#xff0c;不能在最终发布的游戏中使用。这种工具通常用来在开发过程中快速加载编辑器中的资源&#xff0…...

高性能数据分析利器DuckDB在Python中的使用

DuckDB具有极强的单机数据分析性能表现&#xff0c;功能丰富&#xff0c;具有诸多拓展插件&#xff0c;且除了默认的SQL查询方式外&#xff0c;还非常友好地支持在Python、R、Java、Node.js等语言环境下使用&#xff0c;特别是在Python中使用非常的灵活方便。 安装 pip insta…...

IAR全面支持旗芯微车规级MCU,打造智能安全的未来汽车

中国上海&#xff0c;2024年10月18日 — 在全球汽车电子快速发展的今天&#xff0c;IAR与苏州旗芯微半导体有限公司&#xff08;以下简称“旗芯微”&#xff09;联合宣布了一项激动人心的合作——IAR Embedded Workbench for Arm 9.60.2版本现已全面支持旗芯微车规级MCU&#x…...

**深入浅出:TOGAF中的应用架构**

摘要&#xff1a; 在企业架构&#xff08;EA&#xff09;领域&#xff0c;TOGAF&#xff08;The Open Group Architecture Framework&#xff09;是一个广泛应用的框架。本文将带你深入了解TOGAF中的应用架构&#xff0c;帮助你理解其核心概念和实际应用。无论你是初学者还是有…...

Pytorch学习--DataLoader的使用

一、DataLoader简介 DataLoader官网 重要参数&#xff1a;画红框的参数 dataset: 作用&#xff1a;表示要加载的数据集。DataLoader通过该参数从数据集中读取数据。类型&#xff1a;Dataset&#xff0c;即PyTorch定义的Dataset类&#xff0c;用于封装数据并提供数据索引的功…...

代购系统界的“数据大厨”:定制API数据处理,烹饪出美味佳肴

在这个代购的盛宴中&#xff0c;每一位代购者都是一位大厨&#xff0c;他们用数据作为食材&#xff0c;用代码作为烹饪技巧&#xff0c;烹饪出一道道令人垂涎的美味佳肴。今天&#xff0c;就让我们走进代购界“数据大厨”的厨房&#xff0c;看看他们是如何定制API数据处理&…...

二十、Innodb底层原理与Mysql日志机制深入剖析

文章目录 一、MySQL的内部组件结构1、Server层1.1、连接器1.2、查询缓存1.3、分析器1.4、优化器1.5、执行器 2、存储引擎层 二、Innodb底层原理与Mysql日志机制1、redo log重做日志关键参数2、binlog二进制归档日志2.1、binlog日志文件恢复数据 3、undo log回滚日志4、错误日志…...

数据库设计与管理的要点详解

目录 前言1 数据库设计的基础&#xff1a;清晰的事实表1.1 确保数据的一致性和完整性1.2 优化查询性能 2 权限问题与数据问题的区分2.1 确认权限问题2.2 确认数据问题 3 视图与存储过程的合理使用3.1 视图的作用与应用3.2 存储过程的应用与优化 4 数据库操作日志的设计4.1 确保…...

国家科技创新2030重大项目

国家科技创新2030重大项目涵盖多个领域&#xff0c;例如&#xff1a;量子信息、人工智能、深海空间站、天地一体化信息网络、大飞机、载人航天与月球探测、脑科学与类脑研究、健康保障等&#xff0c;这些项目旨在解决制约我国经济社会发展的重大科技瓶颈问题&#xff0c;提升国…...

如何使用 Flutter Local Notifications 插件

如何使用 Flutter Local Notifications 插件 local_notificationsNo longer in development -Flutter plugin for creating notifications项目地址:https://gitcode.com/gh_mirrors/lo/local_notifications 项目介绍 Flutter Local Notifications 是一个为 Flutter 应用程序…...

【openEuler/Centos】yum安装软件报Error: GPG check FAILED【分析根因弄明白,亲测有效不浪费时间】

yum安装软件报Error: GPG check FAILED 环境信息&#xff1a;cat /etc/openEuler-release openEuler release 22.03 (LTS-SP1) 报错信息 The downloaded packages were saved in cache until the next successful transaction. You can remove cached packages by executin…...

实现vuex源码,手写

实现vuex源码&#xff0c;手写 Vuex 是专门为 Vue.js 应用程序开发的状态管理模式 库&#xff0c;它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 第一步&#xff1a;定义初始化Store类 创建文件夹store/vuex.js 1…...

使用 Python 和 Pandas 处理 Excel 数据:合并单元格示例

引言 在数据处理过程中,我们经常会遇到需要从 Excel 文件中提取和处理数据的情况。本文将通过一个简单的示例,介绍如何使用 Python 的 Pandas 库来读取 Excel 文件,处理其中的合并单元格,并将结果输出到新的 Excel 文件中。(这里的合并是列1提取一个数据,列2提取两个数据…...

Python poetry 虚拟环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Poetry是什么&#xff1f;二、使用步骤1.安装poetry2、初始化poetry3、创建虚拟环境 启动和退出虚拟环境poetry 常用指令总结 一、Poetry是什么&#xff1f; P…...

面试官:你会如何设计QQ中的网络协议?

引言 在设计QQ这道面试题时&#xff0c;我们需要避免进入面试误区。这意味着我们不应该盲目地开展头脑风暴&#xff0c;提出一些不切实际的想法&#xff0c;因为这些想法可能无法经受面试官的深入追问。因此&#xff0c;我们需要站在前人的基础上&#xff0c;思考如何解决这类…...

JVM—类的生命周期

目录 类的生命周期 加载阶段 连接阶段 验证阶段 准备阶段 解析阶段 初始化阶段 面试题1 面试题2 类的生命周期 类的生命周期描述了一个类加载、使用、卸载的整个过程&#xff0c;整体可以分为以下五个阶段。 1. 加载 2. 连接&#xff0c;其中又分为验证、准备、解析三…...

SELinux中的安全标记与强制访问控制

SELinux的安全标记和强制访问控制是如何实现的&#xff1f; SELinux&#xff08;Security Enhanced Linux&#xff09;是一个由美国国家安全局&#xff08;NSA&#xff09;开发的Linux内核模块&#xff0c;它实现了强制访问控制&#xff08;MAC&#xff09;。SELinux通过为系统…...

EasyExcel_动态表头的导入导出

文章目录 前言一、EasyExcel二、使用步骤1.引入jar包2.数据准备2.1 数据库 3.方法实例3.1 无实体的导入3.1.1 Controller3.1.2 Service3.1.3 Listener3.1.4 Utils3.1.5 无实体导入数据返回说明 3.2 无实体的导出3.2.1 无实体导出数据(这里只贴出关键代码,Service代码处理)3.2.2…...

uni-app简单模拟人脸识别

uni-app使用live-pusher简单模拟人脸识别页面样式 实现想法调起手机摄像头设置圆形 实现想法 公司的需求是模拟一个人脸识别&#xff0c;不用第三发插件&#xff0c;简单模拟样式即可。 基本思路是调起手机前置摄像头&#xff0c;再设置一个圆形的样式来达到一个基本样式 调起…...

华为HCIE-OpenEuler认证详解

华为HCIE认证&#xff08;Huawei Certified ICT Expert&#xff09;是华为提供的最高级别的专业认证&#xff0c;它旨在培养和认证在特定技术领域具有深厚理论知识和丰富实践经验的专家级工程师。对于华为欧拉&#xff08;OpenEuler&#xff09;方向的HCIE认证&#xff0c;即HC…...

从零开始的Go语言之旅(2 Go by Example: Values)

Go 语言有多种值类型&#xff0c;包括字符串、整数、浮点数、布尔值等。以下是一些基本示例。 package mainimport "fmt"func main() {fmt.Println("go" "lang")fmt.Println("11 ", 11)fmt.Println("7.0/3.0 ", 7.0/3.0)f…...

XShell 中实现免密登录 Linux 服务器的详细流程

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;Linux系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;Linux知识点的补充_Jason_from_China的博客-CSDN博客 XShell 中实现免密登录 Linux 服务器的详细流程&#xff1a; 一、在本地生成…...

网站建设的目标/刚出来的新产品怎么推

Python+OpenCV+Dlib实现人脸68个关键点检测 随着人工智能的发展,计算机视觉技术成为了研究热点之一。其中,人脸识别和人脸关键点检测是计算机视觉领域的两个重要方向。在本文中,我们将介绍如何使用Python语言结合OpenCV和Dlib库,实现人脸68个关键点的检测。 首先,我们需…...

做网站要多少钱 知乎/新seo排名点击软件

Optional初步了解 前言: 一般我们学习一个新的东西,包括工具类,工具库,不可能一下就得心应手,我们要慢慢的了解,有时候了解它,就从一个demo入手,在慢慢在时候它,用熟了,也就基本会使用了 关于Optional类,我在博客上看过很多帖子,但是自己也没有仔细研究过,下面的demo算是个入门…...

临漳 网站建设/老铁seo外链工具

香港服务器防攻击能力怎么样 一个很强的防攻击能力的香港服务器可能吗&#xff1f;我们在购买香港服务器时&#xff0c;都希望能够购买一个香港服务器防攻击能力很强的那样一个服务器。但是&#xff0c;很多时候&#xff0c;我们在各个服务器商那里去咨询的时候&#xff0c;都…...

支持asp的免费空间 适合钓鱼网站/wordpress外贸独立站

一、nginx安装环境 nginx是C语言开发&#xff0c;建议在linux上运行&#xff0c;本教程使用Centos6.5作为安装环境。 gcc 安装nginx需要先将官网下载的源码进行编译&#xff0c;编译依赖gcc环境&#xff0c;如果没有gcc环境&#xff0c;需要安装gcc&#xff1a; yum install…...

做网站赚钱流量/对网络营销的认识有哪些

文|曾响铃 来源|科技向令说&#xff08;xiangling0815&#xff09; 每年的世界人工智能&#xff0c;都会展现不一样的行业洞察&#xff0c;今年在上海举办的这次世界级主题会议也是如此。 只不过&#xff0c;叠加新基建带来的AI浪潮后&#xff0c;无论是占据AI技术绝对领先优…...

wordpress栏目加密/百度推广关键词越多越好吗

转&#xff1a; class反射&#xff08;一&#xff09;&#xff0c;以及Method 的 getReadMethod 与 getWriteMethod 使用 2018年11月28日 17:27:42 zich77521 阅读数 788 class Java在识别类信息与加载它时&#xff0c;通常有两种方式来对类信息进行操作&#xff1a; RTTI&…...