Mysql事务—隔离级别—脏读、不可重复读、幻读-遥遥领先版

事务的基本概念

事务就是一组原子性的操作,这些操作要么全部发生,要么全部不发生。事务把数据库从一种一致性状态转换成另一种一致性状态。

事务最经典也经常被拿出来说例子就是转账了。

假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

  • 原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

  • 一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。

  • 隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的/操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

事务隔离级别

  • Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

存在脏读问题,A用户开启事务修改数据,在修改完未提交的时候,B用户查询了这条数据,查到的修修改了未提交的数据,如果这个时候A用户因为某种原因回滚了,B就拿到了脏数据。

简单点说就是读取到了未提交的数据。

  • Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别会导致所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。存在的问题:不可重复

解决了脏读问题

但存在不可重复读问题,A用户在开启事务,查询完第一个select后,B用户对这一行数据进行更新并提交,A用户执行了和第一次一样的sql语句,发现查询出的数据和第一次不一样。

  • Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。

解决了不可重复读问题

但存在幻读问题,假设我们要为state为VA的客户发放积分,假设满足VA只有一个用户,用户A先开启事务执行查询语句,只查到了一个用户,在提交之前,用户B执行了更新语句并进行提交,这个时候数据库中有两个VA用户了,但A用户只能查到一个,因为可重复读,执行的结果都是一样的,只有当A用户提交之后再查,才能查到2个用户。

  • Serializable(串行化)

通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

那可串行化是如何解决幻读问题的呢?

当用户B开启事务,执行完更新语句,提交之前,用户A开启事务,进行查询,这时候会转圈圈,也就是阻塞等待,他会意识到有其他人在更新这个表,我要再等等,当用户B提交了之后,用户A就可以查询出新增的这条记录了。

MySQL默认采用的REPEATABLE_READ隔离级别,Oracle默认采用的READ_COMMITTED隔离级别

事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVCC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容),但是你要知道的是InnoDB存储引擎默认使用REPEATABLE-READ并不会有任何性能损失。

脏读、不可重复读、幻读

脏读是指一个事务读取到了其他事务没有提交的数据

不可重复读是指一个事务内多次根据同一个查询条件查询出来的同一行记录的值不一样(update)

幻读是指一个事务内多次根据同个条件查出来的记录行数不一样(insert:插入意向锁; delete: record lock)

INNODB 在RR级别如何解决幻读

在快照读情况下,mysql通过mvcc来避免幻读。

在当前读情况下,mysql通过next-key来避免幻读。

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

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

相关文章

libcudart.so.10.2: cannot open shared object file: No such file or directory

文章目录 整体过程细节在虚拟环境中安装cuda 10.2在虚拟环境中安装cuda 12.1 整体过程 首先出现这个报错说明在/usr/local/cuda-11.5/lib64目录中确实没有libcudart.so.10.2这个文件,然后按照网上的教程,我在虚拟环境中安装了cuda10.2(由于用…

mysql面试题九(SQL优化)

目录 1.一条 SQL 是如何执行的 2.索引失效的几种情况 3.EXPLAIN 4.Where 子句如何优化 5.超大分页或深度分页如何处理 6.大表查询如何优化 7.分库分表 基本概念 分库分表方法 水平拆分 垂直拆分 分库分表后的注意事项 1.一条 SQL 是如何执行的 在MySQL中&#xff0…

Windows自动化重启python脚本

博主遇到一个需求:每天都需要定时重启一个python脚本,这个脚本是跑在windows电脑上的,下面是博主的解决方法: 获取已经启动的应用的IDkill这个应用ID再次根据指定的Python环境运行这个脚本 文章目录 解决步骤1. 获取已经启动的应…

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中,地图功能是一个非常常见且实用的功能,可以帮助用户快速定位并浏览周边信息。而在uni-app开发中,使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项,帮助开发者顺利完成地图功能…

掼蛋跟牌技巧

掼蛋跟牌是指其他玩家领出牌,自己跟着出牌,在跟牌的时候,分为强牌和弱牌两种情况,一般强牌以顺牌为主,弱牌以顶牌为主。 一、上家领出牌 在游戏前期,上家领出牌的时候,应该尽量跟牌,…

Pulsar 2

文章目录 一、Pulsar高级组件基本使用1、Funcation(轻量级计算流程)概念与使用Function背景介绍什么是Functions如何使用 2、Pulsar Connector 连接器Pulsar Connector 连接器 ----> Pulsar Flink Connector 3、Transactions事务支持相关的操作Pulsar如何实现Exactly-OncePu…

2024年的Java版本选择?java 17 安装

文章目录 2024年的Java版本选择?java 1.8 和 java17 什么区别?java 17 安装windows 11安装java 17C:\Program Files\Common Files\Oracle\Java\javapath是什么 2024年的Java版本选择? 3年前,java 1.8是市场主流(还有一…

BUU_RE

findit String m String.valueOf(x) valueOf()将不同类型数据转换为字符串 m.equals(edit.getText().toString()) edit.getText()通常用于从用户界面中获取文本输入,toString()方法将其转换为字符串,然后使用equals()方法进行比较 我改成了c代码&a…

乐观锁悲观锁

视频:什么是乐观锁?什么是悲观锁?_哔哩哔哩_bilibili

大象机器人开源六轴协作机械臂myCobot 320 手机摄影技术!

引言 有没有遇到过这样的情况:当你手持手机或相机准备拍摄视频时,心中已经构想了完美的画面,但却因为实际的限制无法捕捉到理想中的角度?这种情况可能会让人感到挫折。例如,如果想要从地面一只蚂蚁的视角拍摄&#xff…

【数据结构7-1-查找-线性-二分法-二叉树-哈希表】

目录 1 查找基本概念2 线性表的查找2.1 顺序查找2.2 二分法查找2.3 分块查找 3 树表的查询3.1 二叉排序树3.1.1 定义3.1.2 二叉树的建立、遍历、查找、增加、删除:3.1.3 代码实现: 3.2 平衡二叉树3.2.1 平横因子3.2.2 不平横树的调整-左旋3.2.3 不平横树…

Python实现的人脸识别系统

一、引言 人脸识别技术作为计算机视觉领域的重要应用之一,近年来得到了广泛的研究和应用。在Python环境下,我们可以利用开源库和算法来实现一个人脸识别系统。本文将介绍如何使用Python及相关库来实现一个简单的人脸识别系统,包括人脸检测、特征提取和匹配识别等关键步骤。…

[系统安全] 六十.威胁狩猎 (1)APT攻击检测及防御与常见APT组织的攻击案例分析

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

大语言模型在专业领域的应用——医疗场景下的大语言模型

大语言模型在专业领域的应用——医疗场景下的大语言模型 构建面向医疗的大语言模型数据资源总结医疗是与人类生活密切相关的重要领域之一。由于具有较强的通用任务解决能力,大语言模型被广泛用于辅助医生处理各种相关医疗任务,例如医疗诊断、临床报告生成、医学语言翻译、心理…

AI大模型-使用 FastChat 部署ChatGLM3

文章目录 FastChat介绍支持的模型安装环境命令行方式加载本地模型web服务方式运行本地模型启动 the controller启动 model worker(s)启动 Gradio web serverAPI-Based的模型支持新模型的支持参考资料FastChat介绍 FastChat是一个用于培训、服务和评估基于大型语言模型的聊天机…

[极客大挑战 2019]Upload、[ACTF2020 新生赛]Upload、[MRCTF2020]你传你呢

[极客大挑战 2019]Upload 打开环境&#xff0c;是上传一句话木马的题 先上传1.php试试&#xff0c;发现不可以 试试改后缀为phtml&#xff0c;提示语句中不能包含<?&#xff0c;只能改木马&#xff1a; <script language"php">eval($_POST[line]);</sc…

etcd集群安装和单机安装

etcd集群安装和单机安装 etcd介绍 etcd 是基于 Raft 的分布式 key-value 存储系统&#xff0c;由 CoreOS 开发&#xff0c;常用于服务发现、共享配置以及并发控制&#xff08;如 leader 选举、分布式锁等&#xff09;。kubernetes 使用 etcd 存储所有运行数据。etcd基于Go语言…

Stm32cubeide 在指定文件夹中生成以时间命名的文件_时间命名的bin文件

其实就是在生成文件后 使用命令将文件转换改名并保存在指定文件下 命令如下 在项目目录下Bin_file文件夹中生成以 项目名称+时间为文件名的bin文件 arm-none-eabi-objcopy ${ProjDirPath}/Debug/*.elf -O binary P r o j D i r P a t h / B i n f i l e / {ProjDirPath}/Bi…

实现多线程并发服务器和多进程并发服务器(Linux网络编程)

多进程并发服务器 实现流程 1. Socket(); 创建 监听套接字 lfd2. Bind() 绑定地址结构 Strcut scokaddr_in addr;3. Listen(); 4. while (1) {cfd Accpet(); 接收客户端连接请求。pid fork();if (pid 0){ 子进程 read(cfd) --- 小写->大写 --write(cfd) close(lf…

pytest测试之conftest详解

一、概述   Conftest是一个Python测试框架&#xff0c;它是pytest的一个组件&#xff0c;用于配置测试环境和参数。通过Conftest&#xff0c;我们可以创建一个可复用的测试配置文件&#xff0c;以便在多个测试模块之间共享配置信息。Conftest非常适合用于管理大型项目中的测试…