事务管理秘籍:MySQL引擎的黄金法则

news2024/9/28 9:22:17

在这里插入图片描述

前言

大家在生活中肯定使用过微信或者支付宝转账吧,那么大家有没有想过一个问题呢?就是如果你向商家转账了,但是突然微信或者支付宝服务器出现问题了,商家并没有收到转账该怎么办呢?

今天我将来带大家了解解决这一问题的方法:MySQL事务🚗🚗🚗

什么是MySQL事务

MySQL事务是指一组数据库操作,这组操作要么全部成功执行,要么全部回滚到操作前的状态。将一系列操作组合成事务可以确保数据的一致性和完整性。就是因为MySQL的这种特性,我们才能尽可能地避免微信或者支付宝转账未收到的问题。

MySQL事务的基本流程是:

start transaction 开启事务

执行操作

commit 提交事务

数据库事务的四个关键特性

  1. 原子性(最核心的特性)
  2. 一致性 事务执行前后,数据是靠谱的
  3. 持久性 事务修改的内容是写在硬盘上的,持久存在的
  4. 隔离性 这个隔离性是为了解决“并发”执行事务,引起的问题

原子性保证事务中的操作要么全部执行成功,要么全部失败回滚;一致性保证事务结束后数据库的状态是合法的;隔离性确保各个并发事务相互隔离,相互之间不会影响彼此的操作;持久性保证一旦事务提交,其所做的改变将永久保存在数据库中。

如果并发的这些事务修改的是不同的表/不同的数据,没什么大问题。
但是如果修改的是同一个表/同一个数据 可能会带来一定的问题

并发执行事务可能产生的问题以及解决方法

1.脏读

脏读是指一个事务在读取了另一个未提交事务的数据时,导致读取到了未经验证的、可能是临时的、不一致或无效的数据。脏读可能会导致数据的不一致性和错误的结果。

脏读的发生是由于MySQL支持事务的并发执行,每个事务都有自己的隔离级别来控制事务与其他事务之间的交互。在读未提交的隔离级别下,一个事务可以读取到另一个事务尚未提交的数据。

举个例子,假设有两个事务同时执行以下操作:
事务A:
UPDATE table SET column='Value' WHERE id=1;
事务B:
SELECT * FROM table WHERE id=1;
在事务A执行UPDATE语句时,数据行被修改但还未提交。此时,如果事务B执行SELECT语句并读取到了事务A修改的数据行,就会发生脏读。如果事务A最终回滚了,那么事务B读取到的数据实际上是无效的或不一致的。

脏读可能会引发严重的数据问题,特别是当事务依赖于准确的、一致的数据时。

如何解决脏读问题

  1. 使用合适的隔离级别:选择适当的隔离级别来控制事务的并发读取行为。较高的隔离级别(如可重复读或序列化)可以防止脏读,但可能导致并发性能下降。因此,需要根据应用的需求和数据的一致性要求选择合适的隔离级别。

  2. 使用事务和锁:将读操作和写操作组合成事务,使用事务来保证读取的数据是一致的。同时,在修改数据时使用适当的锁来避免并发访问问题。通过控制事务的提交和回滚来确保数据的一致性。

  3. 使用行级锁:MySQL提供了行级锁的机制,可以在修改数据时只锁定需要修改的行,而不是锁定整个表。这样可以减少锁竞争和并发性问题,提高系统的并发性能。

  4. 使用乐观锁或悲观锁:乐观锁是通过使用版本号或时间戳等机制来控制并发访问的,它假设冲突很少发生;而悲观锁则是通过锁定资源以防止其他事务访问,它假设冲突频繁发生。根据应用需求和数据访问模式,选择合适的锁策略。

  5. 优化事务和查询:合理设计事务的范围和持续时间,避免长时间的事务占用资源。同时,优化查询语句和索引的使用,减少数据访问冲突和锁竞争。

  6. 合理处理异常和回滚:在事务执行过程中,及时处理异常情况,并正确回滚事务。避免出现未捕获的异常或回滚失败导致的脏数据问题。

2.不可重复读

不可重复读是指在一个事务中,多次读取同一数据时,得到的结果不一致的情况。不可重复读是由于并发事务对数据的修改造成的,与脏读类似,但不可重复读更关注的是读取多次同一数据时的一致性。

举个例子,假设有两个事务同时执行以下操作:
事务A:
SELECT * FROM table WHERE id=1;
事务B:
UPDATE table SET column='Value' WHERE id=1;
在事务A第一次执行SELECT语句时,读取到了id为1的数据行。然后,在事务B执行UPDATE语句修改了id为1的数据行的column字段。此时,如果事务A再次执行SELECT语句,就会发现得到的结果与之前的查询结果不一致,产生了不可重复读的现象。

不可重复读可能会导致以下问题:

  1. 数据的一致性问题:同一个事务内读取到不同的数据版本,可能导致数据的不一致或错误的结果。

  2. 业务逻辑问题:如果事务在读取数据后进行了基于这些数据的业务逻辑处理(如计算、判断等),如果多次读取的数据不一致,可能导致业务逻辑的错误。

如何解决不可重复读问题

  1. 使用合适的隔离级别:较高的隔离级别(如可重复读或序列化)可以防止不可重复读问题。可重复读隔离级别使用一致性视图来读取数据,保证同一个事务内读取到的数据保持一致。

  2. 使用行级锁或乐观锁:通过在修改数据时使用行级锁或乐观锁来防止其他事务对数据进行修改。这样可以保证在同一个事务内多次读取的数据一致性。

  3. 优化事务的范围和持续时间:尽量缩小事务的范围和持续时间,减少事务执行期间其他事务对数据的修改。这样可以降低发生不可重复读的概率。

  4. 合理设计业务逻辑:在事务内进行业务处理时,需要考虑可能出现不可重复读的情况,设计合适的逻辑来处理这种情况。

3.幻读

幻读是在并发事务中的一种现象,其特点是一个事务在读取数据时,另外一个事务插入了新的数据行,导致第一个事务重新读取数据时,发现多了一些之前不存在的数据行(幻行)。

幻读的出现是由于事务隔离级别的存在,MySQL支持多种事务隔离级别,包括读未提交、读提交、可重复读和串行化。在默认的可重复读隔离级别下,幻读是可能发生的。

当一个事务开始时,MySQL会对查询结果集中的数据行进行加锁,以保证事务的隔离性。在可重复读隔离级别下,MySQL使用共享锁防止其他事务对数据行进行修改,而在事务结束时才释放锁。但是,共享锁只能保证数据行不被删除或修改,却无法防止数据行的插入。因此,在一个事务中,如果先后执行了两个相同的查询语句,第一次查询获取的结果集和第二次查询获取的结果集可能不一样,就会出现幻读的问题。

举个例子,假设有两个事务同时执行以下操作:
事务A:
SELECT * FROM table WHERE column=1;
事务B:
INSERT INTO table (column) VALUES (1);
首先,事务A读取到了满足条件的数据行,而此时事务B插入了一个新的数据行,使得事务A重新读取数据时发现存在一个之前不存在的数据行,这就是幻读的典型情况。

如何解决幻读问题

  1. 使用合适的隔离级别:较高的隔离级别(如可重复读或序列化)可以防止幻读问题。可重复读隔离级别使用一致性视图来读取数据,保证在同一个事务内多次执行的查询结果集一致。

  2. 使用锁或乐观锁:通过在事务中使用行级锁或乐观锁来防止其他事务对数据进行插入或删除。这样可以保证在同一个事务内多次执行的查询结果集一致。

  3. 使用范围锁或间隙锁:范围锁和间隙锁可以在读取数据时锁定一定范围的数据,防止其他事务对该范围内的数据进行插入或删除。

  4. 优化事务的范围和持续时间:尽量缩小事务的范围和持续时间,减少事务执行期间其他事务对数据的插入或删除。这样可以降低发生幻读的概率。

  5. 合理设计业务逻辑:在事务内进行业务处理时,需要考虑可能出现幻读的情况,设计合适的逻辑来处理这种情况。

在读加锁和写加锁的前提下,数据库使用“串行化”这样的方式来解决幻读,彻底放弃并发处理事务,一个接一个的串行的处理事务。这样做,并发程度是最低的(效率最慢的),隔离性是最高的(数据准确性也是最高的)

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

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

相关文章

浙大GMSCM十周年庆典圆满闭幕!宁海元携易知微进行主题分享

6月24日,浙江大学与加拿大麦吉尔大学携手创办的全球制造与供应链管理硕士项目(Master in Global Manufacturing and Supply Chain Management)十周年庆典在浙江大学隆重召开。本次论坛致力于为制造业、服务业、物流业、金融业等各行业管理人员…

Java安装并使用Jmter测试微服务高并发下的服务雪崩场景

高并发会给微服务带来什么样的的问题? 在微服务架构中,我们将业务拆分成一个个的服务,服务和服务之间可以互相调用,但是由于网络原因或者自身的原因,服务并不能保证服务100%是可用的,如果单个服务出现问题,调用这个服务的时候就会出现网络延迟在系统中一直阻塞等待(阻塞就意味…

【kubernetes系列】Kubernetes之service

本章节将分享一下关于kubernetes中service的相关知识。 一、service 概述 Service也是Kubernetes里的最核心的资源对象之一,正是因为对此概念的支持,Kubernetes在某种角度下可以被看成是一种微服务平台。由于Kubernetes中的pod并不稳定,比…

从0到1精通自动化测试,pytest自动化测试框架,pytest分布式执行(pytest-xdist)(十六)

一、前言 平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟 如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候,我们会用测试人力成本换取时间成本,这个时候多找个小伙伴把…

【技术操作】如何通过抓包来分析EasyCVR不回复上级平台的invite请求?

EasyCVR平台基于云边端协同架构,可支持多协议、多类型的海量设备接入与分发,平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,在线下均有大量应用。 有用户反馈,在级联时,使用EasyCVR作为下级…

【2023年全新保姆级教程】解决Ubuntu文件系统磁盘空间不足low disk space on filesystem root

** 解决Ubuntu22.04文件系统磁盘空间不足low disk space on filesystem root ** 大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流…

QGIS实战操作-解决TIFF影像黑边问题

QGIS实战操作-解决TIFF影像黑边问题 问题描述 "TIFF图像黑边问题"就是当我们处理或使用TIFF格式的遥感或者地理信息数据时,经常会在图像边缘看到一些不该出现的黑色区域,这些黑边可能会影响我们对图像的观看体验,甚至可能对图像的…

Unity 自定义代码模板

文章目录 1. Unity 中自带的代码模板创建自己的代码模板3. 代码模板的修改4. 自定义标签 1. Unity 中自带的代码模板 在 Unity 的安装目录下找到 Unity\Editor\Data\Resources\ScriptTemplates 文件夹,结构如下: 对应上图可得出: 文件名后…

CSS知识点汇总(一)

介绍一下标准的 CSS 的盒子模型? 两种盒子模型:IE盒模型(border-box)、W3C标准盒模型(content-box) 盒模型: 分为内容(content)、填充(padding)、边界(margin)、 边框(border)四个部分&#x…

IntelliJ IDEA maven 引用本地 jar 文件

一、背景说明 由于某些特定原因,不能在远程maven仓库中下载所需要版本的jar文件,需要在maven中引用本地jar文件。 二、解决方案 1、创建 libs 目录 为了方便jar包管理,可以在工程目录下,创建一个与src目录平级的libs目录。如下…

OpenCV之Window开发环境配置

下载opencv开发包 win配置: 双击SDK包解压 解压中 解压成功 配置环境变量 验证环境 创建控制台应用并配置工程属性表添加opencv环境 创建属性表 配置属性 复制属性表并修改名Project1X64_Debug与Project1X64_Release 导入属性表 测试opencv功能 示例代码 #include <ope…

rsync安装使用

目录 一、磁盘性能测试安装fio磁盘性能测试工具测试内容为顺序读、随机读、顺序写、随机写、随机读写结果分析 二、CPU性能测试安装sysbench性能测试工具结果分析 三、内存性能测试结果分析 四、网络性能测试测试iperf3工具测试结果分析1.测试TCP吞吐量2 . 测试UDP丢包和延迟 此…

Kubernetes-Ingress、Ingress Controller、Ingress Class

概念 1.Ingress 是对K8S集群中服务的外部访问进行管理的 API 对象。Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。 2.Ingress Controller 通常负责通过负载均衡器来实现 Ingress。 3.必须拥有一个 Ingress Controller…

【已解决】如何下载使用公司内部Maven私有仓库中的依赖

文章目录 1、前言2、解决办法3、总结 1、前言 ​今天刚来公司实习&#xff0c;面对leader抛来的项目和文档&#xff0c;对于第一次实习的我&#xff0c;显然有点手足无措&#xff0c;于是就按着平时写代码的习惯。1、拉代码放本地&#xff1b;2、开始导入项目依赖&#xff1b;…

go channel 详解

一、概述 在Go语言中&#xff0c;channel是一种特殊的类型&#xff0c;用于在并发编程中实现不同的goroutine之间的通信和同步。本文将深入探讨golang的channel是如何工作的&#xff0c;并介绍如何使用channel来提高程序的性能和可靠性。 二、什么是Channel&#xff1f; 在G…

【Opencv】----- 图片无缝融合

上次写了一篇关于GAN缺陷生成的图片的&#xff0c;发现大家的对这个根本不感兴趣&#xff0c;可能是用于在座的各位觉得样本有的是&#xff0c;我为什么还苦哈哈的去生成啊&#xff0c;说的也不是没有道理&#xff0c;可能只是我搞了更加苦哈哈的工业深度学习吧&#xff0c;所以…

软件测试技能,JMeter压力测试教程,监听器之每秒事务数与响应时间(十四)

前言 压测的时候&#xff0c;我们会经常关注2个重要的指标 TPS 和 RT TPS&#xff1a;每秒处理的事务数(Transactions per Second)&#xff0c;jmeter的Throughput为吞吐量&#xff08;请求数/秒&#xff09; RT&#xff1a;响应时间(Reponse Time&#xff09;&#xff0c;从…

西亚文明的时空概念与历史上的文明形态

“西亚”这个地理概念主要指的是今日土耳其、伊朗、伊拉克、叙利亚、黎巴嫩、约旦、以色列和沙特等阿拉伯半岛国家所在的地区。若以地理区域来划分&#xff0c;与西亚文明比较密切的区域主要有&#xff1a;小亚细亚&#xff08;今土耳其&#xff09;、两河流域&#xff08;今伊…

n.moduleList 和Sequential的解析与对比

n.moduleList 和Sequential的解析与对比 1.nn.ModuleList2.nn.Sequential3、nn.Sequential与nn.ModuleList的区别4、使用场景 1.nn.ModuleList 2.nn.Sequential 3、nn.Sequential与nn.ModuleList的区别 4、使用场景

汇编输入int 16h

int 16h 读入缓冲区ASCII码 检测点17.1 int 16h会设置if1 assume cs:code code segment start:mov ah,0int 16hmov ah,1cmp al,rje redcmp al,gje greencmp al,bje bluejmp sret red:shl ah,1 green:shl ah,1 blue:mov bx,0b800hmov es,bxmov si,1mov cx,2000 s: mov byte ptr…