Mysql事务中的一些问题,还有解决方法原理(ACID、脏读幻读重复读、next-key)

**

首先,事务是什么?

**
是一系列或者一组sql操作看作一个整体,作为一个事务,这一组sql要么都执行,要么都不执行。当所有sql都能执行成功的时候,commit当前事务,当其中一个sql出现问题时,rollback回滚所有操作到事务开始前的状态。

事务要满足ACID

A:原子性,要么都成功执行,要么都不执行。
C:一致性,事务前后不能破坏数据库的结构。
I:持久性,事务成功,则更改的数据就是永久有效的。
D:隔离性,事务之间应该是互不影响的。

事务在并发执行的时候会出现很多问题,通俗的说就是有俩或者更多事务在操作同一些数据,就会造成数据混乱。这些数据混乱用专业术语表示就是脏读、幻读、不可重复读。

经常有人分不清幻读和不可重复读,“我刚第一次查这个性别还是男,第二次查怎么就是女了,脏读幻读不能重复读了”、“刚才查这条数据还没有,现在插入怎么提示有数据了,脏读幻读不能重复读了”,,,,,,,,
其实这仨字面意思感觉都能解释所有现象,但是对不同出现的问题情况是有不同的解释的。我说一下不同的地方在哪:
脏读:侧重点在于读取到别的事务没提交的数据。(这个大家还是比较清晰的)

幻读:侧重点在于读-写。先读了一个范围的数据,没有要准备插入的那条数据,但是在执行插入的时候,却提示已经存在了!
先读–没有–插入–失败,这就是幻读。

不可重复读:侧重的是读-读。先读某条数据性别是男,第二次读的时候变成女了。两次读的数据不一致,读–男--读–女。

这样解释我觉得还是很好理解的。那么mysql是如何解决这种问题的呢?或者我们在使用中应该如何避免出现这些问题呢?

mysql自己有四种隔离级别,来规定每个事务之间的隔离程度。

未提交读:查询的时候可以查询到别的事务还没提交的数据,会出现脏读幻读不可重读,毫无安全性可言,一般不会选择使用这种隔离级别,除非你的业务只有读操作!

提交读:字面意思,通过MVCC每次都读取最新的已提交的数据版本,只能读到事务提交后的数据。解决了脏读!

可重复读(默认):通过MVCC第一次读时候生成快照,后面再读就根据快照里的读取指定版本的数据,这样每次读取到的数据都是一样的(不保证最新,只保证一致)。
我们可以自己手动解决不可重复读,select时候加上读锁(lock in share mode共享锁),加上之后别的事务就不能修改,你不提交事务不释放这个读锁,这个数据你每次读都一样。(如果你在当前事务内还想更改这条数据,那你第一次查的时候就自己加上排他锁)。
其实在这个隔离级别下,innodb推出了next-key锁帮助解决幻读。在范围查的时候(BETWEEN、>、<、>=、<=等操作符进行查询),for update或者share in lock mode会加上next-key锁(record key+gap key),查询加上锁,再插入就不会出现幻读了。

以上是事务并行时会出现的问题和并行时的解决办法。那么当事务串行时乱七八糟读都不存在了!但是事务一个一个执行,可想而知你的程序会有多慢了!
串行化:这个隔离级别基本没人用!

补充一下,MVCC(多版本并发控制)

MVCC是什么?为了解决什么问题?ReadView是什么?看名称可以看出是事务并发时候用的,多版本指的是数据最后是由哪个事务操作的,版本号也可以理解成事务id。
ReadView快照记录的是你要查询的数据的版本号,根据这个版本号去查询指定版本的数据。
我的理解是MVCC+隔离级别 = 快照。快照是每次select查询时的数据版本号,增加读取性能。
MVCC给所有数据增加了版本号,隔离级别决定你可以读取哪个版本的数据。
未提交读会查询到其它事务没提交的数据,就是不区分版本,未提交的版本也会查到,所以没有必要生成快照。

MVCC+提交读 = 每次查都返回最新事务最后提交的版本快照,每次读取都是一个新的快照。(所以会出现幻读)
MVCC+重复读=只在第一次查的时候生成快照(在此事务之前提交的数据版本),后续查只返回快照里的版本数据。 不影响其它事务修改,其它事务修改了数据,当前事务也是返回快照里的版本数据。单纯保证每次读都是一样的数据。

以上mysql自己的隔离级别就可以解决大部分的使用情况,如果你不放心你要操作的数据,就自己手动加上锁!!!
但是一定要适度合理,加锁虽好,但是会影响性能,纯查的话就别瞎加锁!

解释的清晰吗?大家可以看完可以理解了吗?可以的话在下面扣个1!没有解释清楚的话大家可以一起讨论一下!然后我再补充!

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

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

相关文章

【设计模式系列】享元模式(十五)

目录 一、什么是享元模式 二、享元模式的角色 三、享元模式的典型应用场景 四、享元模式在ThreadPoolExecutor中的应用 1. 享元对象&#xff08;Flyweight&#xff09;- 工作线程&#xff08;Worker&#xff09; 2. 享元工厂&#xff08;Flyweight Factory&#xff09;- …

为什么分布式光伏规模是6MW为界点

安科瑞 华楠 近日&#xff0c;能源局发布定义分布式光伏6MW及以上的光伏电站必须自发自用&#xff0c;自行消纳。多省能源局规定大于6MW的电站必须按集中式管理&#xff0c;另外大于6MW&#xff08;包含&#xff09;要省级审批&#xff0c;小于则由市级审批&#xff0c;10kV线…

RDD 算子全面解析:从基础到进阶与面试要点

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

四万字长文SpringBoot、Spring、SpringMVC等相关面试题(注:该篇博客将会持续维护 最新维护时间:2024年11月12日)

&#x1f9f8;本篇博客重在讲解SpringBoot、Spring、SpringMVC等相关面试题&#xff0c;将会实时更新&#xff0c;欢迎大家添加作者文末联系方式交流 &#x1f4dc;JAVA面试题专栏&#xff1a;JAVA崭新面试题——2024版_dream_ready的博客-CSDN博客 &#x1f4dc;作者首页&…

02_ElementUI

一.前端工程化 1.1 概述 前端工程化是使用软件工程的方法来单独解决前端的开发流程 中模块化、组件化、规范化、自动化的问题,其主要目的为了 提高效率和降低成本。 1.2 NodeJS的安装 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环 境&#xff0c;可以使 JavaS…

三、运算符、数据类型转换(显式、隐式)、语句(if、三元、switch、while、for)

1. 运算符 1.1 自增自减 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> &…

数据安全、信息安全、网络安全区别与联系

关键字&#xff1a; 信息安全 数据安全 网络安全 [导读] 在 “互联网 ” 被广泛提及的今天&#xff0c;安全问题也越来越多的受到人们关注&#xff0c;然而很多人对于 “信息安全”、“数据安全”、“网络安全” 的概念并不是很清楚。我们汇总了官方机构给这三者的定义&#…

基于单片机的多功能视力保护器设计(论文+源码)

1. 功能设计 本次课题为多功能视力保护器&#xff0c;具体设计功能如下&#xff1a; (1)当使用者的眼睛距离写字台低于25cm时&#xff0c;报警灯闪烁以提醒使用者及时调整坐姿。 (2)学习环境光线自动检测&#xff1a;当光照强度低于1001X时&#xff0c;语音提醒使用者调整光…

关于sass在Vue3中编写bem框架报错以及警告问题记录

在编写完bem框架后 在vite.config.ts文件进行预编译处理时&#xff0c;报错的错误 1. 处理方式&#xff1a;使用新版api&#xff0c; 如图&#xff1a; 2. 处理方式&#xff1a;使用 use 替换掉 import&#xff0c; 如图&#xff1a; 3. 处理方式&#xff1a;使用路径别名&am…

【 AI写作鹅-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

什么是 eCPRI,它对 5G 和 Open RAN 有何贡献?

这里写目录标题 eCPRI 协议平面&#xff1a;功能分解eCPRI与CPRI的区别CPRI具有以下特点&#xff1a;eCPRI具有以下特点&#xff1a;eCPRI 的优势 所需带宽减少 10 倍适用于 5G 和 Open RAN 的 eCPRI&#xff1a; 通用公共无线接口&#xff08;CPRI&#xff09;是一种行业合作&…

《硬件架构的艺术》笔记(二):时钟与复位

本章主要针对ASIC设计给出建议&#xff0c;独立于CAD工具以及工艺&#xff0c;主要针对模块设计和存储器接口。 同步设计 这是对时钟域控制最安全的方法&#xff0c;单个主时钟和单个主置位/复位信号驱动设计中所有时序器件。 避免使用行波计数器 行波计数器&#xff1a;用触…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

「QT」几何数据类 之 QVector2D 二维向量类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

NVIDIA RTX 系统上使用 llama.cpp 加速 LLM

NVIDIA RTX 系统上使用 llama.cpp 加速 LLM 文章目录 NVIDIA RTX 系统上使用 llama.cpp 加速 LLMllama.cpp 概述llama.cpp 在 NVIDIA RTX 上的加速性能使用 llama.cpp 构建的开发人员生态系统使用 llama.cpp 在 RTX 平台上加速的应用程序开始使用 适用于 Windows PC 的 NVIDIA …

[CKS] K8S NetworkPolicy Set Up

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于不安全项目修复的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] K8S Ne…

Odoo:免费开源的流程制造行业ERP管理系统

概述 聚焦流程制造连续性生产的特性&#xff0c;提供集成PLMERPMESBI的一体化解决方案&#xff0c;涵盖计划、生产、质量、配方、供销、库存、成本、设备、资金管理等业务领域的整体性解决方案 行业的最新洞察&行业典型痛点 一、生产过程需要精细化控制 需要在各种制约…

MySQL技巧之跨服务器数据查询:基础篇-动态参数

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-动态参数 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQL 以及用同样的方法&a…

【Python爬虫实战】轻量级爬虫利器:DrissionPage之SessionPage与WebPage模块详解

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、SessionPage &#xff08;一&#xff09;SessionPage 模块的基本功能 &#xff08;二&#xff09;基本使…

vue3使用VueQuill插入自定义按钮

在 Vue 3 项目中使用 VueQuill 编辑器时&#xff0c;我们可以自定义内容来满足特定的需求。本文将介绍如何在 VueQuill 中插入自定义内容&#xff0c;比如插入特定的标签或样式元素。 Quill官方中文文档 1. 项目设置和依赖安装 如果你还没有创建 Vue 3 项目&#xff0c;可以…