[MySQL]02关于事务的解析

news2024/12/23 17:18:47

目录

原子性

一致性

持久性

隔离性

事务隔离级别

并发执行可能存在问题

脏读问题

不可重复读

幻读

难点解析


原子性

事务最核心的就是原子性
以前人们认为原子不可再分,用原子性来表示一个事务不可分割

update account set balance=balance-500 where name ="张三"
如果在此过程中数据库崩溃,那么张三扣钱而李四不加钱
update account set balance=balance+500 where name ="李四"

要么全部都不执行,要么全部都执行

事务就能保证,当执行过程中出现问题的时候,自动把前面SQL执行的效果进行还原,恢复如初,回滚rollback

在事务执行过程中,mysql才会记录每一步执行了什么,一旦有问题就回滚

事务有空间代价和时间代价,事务只有在开启状态才会消耗这些代价

如果是ctrl+z的话意味着每一步回退和记录都得消耗这个空间和时间


实际上人对SQL操作在实际运用中并不是很多,大部分都是机械在对服务器进行操作,出错概率很小,撤回机制没有必要。

开启事务:start transaction;

执行多条SQL语句

回滚或提交:rollback/commit;

除了原子性外事务还有



一致性


事务执行前后,数据处在一致状态,数据CURD对的上



持久性


事务进行的改动,都是写到硬盘,不会随着程序重启/主机重启后丢失



隔离性


多个事务,并发执行的时候,事务之间能够保持隔离,互不干扰。
同一时刻,多个客户端都给服务器提交事务,执行事务


事务隔离级别

  • read uncommitted 允许读未提交的数据,并发程度相当高,隔离性最低,可能有脏读,不可重复读,幻读的问题
  • read commited 只能读提交后的数据,相当于对写进行加锁,并发性开始下降,隔离性开始提高,解决了脏读的问题
  • repeatable read 读和写操作都加了锁,并发程度再降低,隔离性再提高,解决了脏读,不可重复读,可能会有幻读的问题
  • serializable 严格执行串行化,并发程度最低,隔离性最高,解决了脏读,不可重复读,幻读的问题,但效率最低

MySQL默认为repeatable read
在MySQL配置文件中my.ini中进行设置,根据不同的需求场景,可以设置不同的档位

并发执行可能存在问题

脏读问题

一个事务A在修改数据同时,另一个事务B读取了数据,此时A很可能在提交的时候修改
了B读取的数据,导致事务B读取的数据为无效数据,这种错误操作就是脏读操作

解决方法:在事务提交之前,不能进行读操作,提交之后才能读
也就是对 写操作 加锁

在加锁之前,我的写操作,和同学的读操作就是完全高并发的
但是并发性虽然高,隔离性却是最低的
在加锁之后,写的时候不能进行读操作,并非性降低了,隔离性提高了


不可重复读

在一个事务A中多次读取同一个数据,发现不一样


解决方法: 读数据的时候,不能修改,读加锁

引入读加锁后,并发程度进一步降低了,效率也下降了
但隔离性提高了,数据准确性也提高了


幻读

特殊的不可重复读,对A文件进行读的时候,增加了新文件B
导致读之前的结果集与读之后的结果集不同。

解决方法:

串行执行,效率最低,并发程度最低,此时,隔离性最高,数据的准确性最高。

MySQL的优化措施: REPEATABLE_READ(可重复读)+间隙锁就能解决幻读问题了,不一定要串行化 这样就构造了一个查锁吗,查的数据被锁了,不查的空数据也被锁了

间隙锁:加锁范围是被查询范围内的空隙(未填写数据的空位置),防止查询期间其他事务插入到间隙中,导致读之前的结果集与读之后的结果集不同。


上述
三种情况,不一定是bug,要根据实际需求,需要考虑对特定目标的准确性要求

衡量是不是BUG的唯一标准,就是看是否符合需求


难点解析


1.REPEATABLE_READ(可重复读)给查的数据加上锁,在事务结束之前都不能修改,以此来解决不可重复读问题

2.REPEATABLE_READ(可重复读)+间隙锁就能解决幻读问题了,不一定要串行化
这样就构造了一个查锁吗,查的数据被锁了,不查的空数据也被锁了

3.串行化就是等一个结束了再上另一个事务(类似葫芦娃救爷爷)

4.在串行化隔离级别下,读操作也会被加锁(一般是共享锁),不过在读取数据后就会放开数据,多个事务可以交替读.但是只能由一个事务改,且在写完之前都不能读


哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞捏
Thanks♪(・ω・)ノ

 

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

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

相关文章

Go语言入门指南:基础语法和常用特性(下)

上一节,我们了解Go语言特性以及第一个Go语言程序——Hello World,这一节就让我们更深入的了解一下Go语言的**基础语法**吧! 一、行分隔符 在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ;…

MySQL基础篇(二)

DML 定义:Data Manipulation Language、数据操作语言(增删改) 添加数据(INSERT)修改数据(UPDATE)删除数据(DELETE) 添加数据(INSERT) 给指定的…

day0818

1. #include <myhead.h> int file_len(const char*strfile, const char*dstfile); void file_copy(const char* strfile, const char* dstfile, int start, int size); int main(int argc, const char *argv[]) {//判断是否传入两个文件if(argc!3){printf("input fi…

最新消息:谷歌将在Chromebook上运用UWB技术,无线通信更上一层

超宽带&#xff08;UWB&#xff09;技术是一种创新的短距离无线通信技术&#xff0c;具有高速数据传输和精确定位物体位置的优势。尽管该技术已经存在一段时间&#xff0c;但最近开始广泛应用于各种设备中。据最新报道&#xff0c;Pixel Watch 2可能会搭载UWB模块&#xff0c;这…

VSCode之C++ SQLite3 SmartDB实现

背景 承接上篇VSCode配置之C & SQLite3极简配置方案&#xff0c;参考《深入应用C11: 代码优化与工程级应用》&#xff0c;基于VSCodeCmake无痛实现SmartDB。 GitHub路径&#xff1a; smartDB_tutorial 结果展示 主要变化(与SmartDB1.3相比&#xff09; 1&#xff09;使用…

【【萌新的STM32学习-11】】

萌新的STM32学习-11 终于进入了正点原子的入门篇进行一些简单的设计 GPIO General Purpose Input Output 通用输入输出端口 简称GPIO 作用 &#xff1a;负责采集外部器件的信息或者控制外部器件工作&#xff0c;即输入输出 GPIO 的特点 1&#xff0c;不同型号&#xff0c;IO数…

HTML浪漫动态表白代码+音乐(附源码)(二)

一. 前言 七夕马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家加几款实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;求爱表白等场景&#xff0c;可直接使用。 来吧&#xff0c;展示&am…

第 7 章 排序算法(3)(选择排序)

7.6选择排序 7.6.1基本介绍 选择式排序也属于内部排序法&#xff0c;是从欲排序的数据中&#xff0c;按指定的规则选出某一元素&#xff0c;再依规定交换位置后达到排序的目的。 7.6.2选择排序思想: 选择排序&#xff08;select sorting&#xff09;也是一种简单的排序方法…

13.PV和PVC

文章目录 PV和PVC概念定义PV定义PVC创建静态PV和PVC创建动态PV和PVCNFS配置创建 Service Account和角色创建存储卷插件创建 StorageClass创建PVC创建pod 总结 PV和PVC 概念 PV 全称叫做 Persistent Volume&#xff0c;持久化存储卷。它是用来描述或者说用来定义一个存储卷的&…

1593页54万字电力行业数字化转型智慧电力云平台整体解决方案WORD

导读&#xff1a;原文《1593页54万字电力行业数字化转型智慧电力一体化监管云平台整体解决方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 南方电网一体化…

基于Pytorch实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…

TCP协议报文结构

TCP是什么 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、全双工的传输协议。它使用头部&#xff08;Header&#xff09;和数据&#xff08;Data&#xff09;来组织数据包&#xff0c;确保数据的可靠传输和按序传递。 TCP协议报文结构 下面详细阐述TCP…

SSH远程直连--------------Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 在某些特殊需求下,我们想ssh直接远程连接docker 容器,下面我们介绍结合cpolar工具实现ssh远程直接连接docker容器…

excel 动态表头与合并列

零、希望Springboot-java导出excel文件&#xff0c;包括动态表头与下边合并的列 使用 org.apache.poi 与自己封装工具类实现相关功能。代码如下 一、代码 1、依赖 implementation(group: org.apache.poi,name: poi-ooxml,version: 4.1.0)implementation(group: org.apache.po…

【Docker】存储卷Volume

Docker Volume概念 什么是存储卷 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的…

1139. 最大的以 1 为边界的正方形;2087. 网格图中机器人回家的最小代价;1145. 二叉树着色游戏

1139. 最大的以 1 为边界的正方形 核心思想&#xff1a;枚举正方向的右下角坐标&#xff08;i&#xff0c;j&#xff09;&#xff0c;然后你只需要判断四条边的连续一的最小个数即可&#xff0c;这里是边求连续一的个数同时求解结果。 087. 网格图中机器人回家的最小代价 核心…

PHP自己的框架实现操作成功失败跳转(完善篇四)

1、实现效果&#xff0c;操作成功后失败成功自动跳转 2、创建操作成功失败跳转方法CrlBase.php /**成功后跳转*跳转地址$url* 跳转显示信息$msg* 等待时间$wait* 是否自动跳转$jump*/protected function ok($urlNULL,$msg操作成功,$wait3,$jump1){$code1;include KJ_CORE./tp…

FPGA原理与结构——可配置逻辑块CLB(Configurable Logic Block)

一、什么是CLB 1、CLB简介 可配置逻辑块CLB&#xff08;Configurable Logic Block&#xff09;是xilinx系类FPGA的基本逻辑单元&#xff08;在各系列中CLB可能有所不同&#xff0c;以下我们主要讨论Xilinx 7系类&#xff09;&#xff0c;是实现时序逻辑电路和组合逻辑电…

基于Pytorch构建DenseNet网络对cifar-10进行分类

DenseNet是指Densely connected convolutional networks&#xff08;密集卷积网络&#xff09;。它的优点主要包括有效缓解梯度消失、特征传递更加有效、计算量更小、参数量更小、性能比ResNet更好。它的缺点主要是较大的内存占用。 DenseNet网络与Resnet、GoogleNet类似&#…

如何下载英伟达NVIDIA旧版本驱动,旧版本驱动官方网址

https://www.nvidia.cn/Download/Find.aspx?langcn 也可以直接搜索英伟达官网&#xff0c;点击驱动程序&#xff0c;然后点击试用版驱动程序&#xff0c;里面不但有试用版的驱动&#xff0c;还有之前发布的所有驱动