MySQL事务,锁,MVCC总结

mysql中最重要的就是事务,其四大特性让我们维持了数据的平衡,一致。那么事务究竟是什么,与什么相关,他的使用步骤,以及使用过程中我们会遇到什么问题呢?下面我们一起学习交流!

1.MySQL的存储引擎:

        存储引擎是数据库底层软件组织,数据库管理系统使用存储引擎存储,管理数据,不同的存储引擎提供不同的功能(存储机制,索引技巧,锁定水平)。

        MySQL提供了许多不同的存储引擎,如InnoDB,MyISAM,此处我们只这两种作对比

对比项MyISAM

InnoDB

外键不支持支持
事务不支持支持
行表锁表锁,即使操作一条记录也会所著整个表,不适合高并发操作行锁,操作时治所铸某一行,不对其他行有影响,适合高并发操作
缓存只缓存索引,不缓存真实数据不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响
默认安装YY
默认使用NY
关注点性能:节省资源,消耗少,简单业务事务:并发写,事务,更大资源
2.什么是事务,事务的特点,限制

        事务:就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行

        事务特点:一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会失败,数据库数据就会回滚到该事务开始之前的状态。

        限制:MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务

3.MySQL开启事务的步骤
-- 1.关闭MySQL自动提交
set autocommit=0;
-- 2.开启一个事务,标志事务的起始点
start transaction;-- 一组SQL语句-- 结束事务,逻辑判断if  条件-- 向数据库提交事务commit;else -- 将事务回滚,所有的数据库操作取消rollback;-- 开启MySQL自动提交
set  autocommit=1
4.事务的四大特性:

        原子性:数据库中的事务执行是作为原子粒度,即不可再分,整个语句要莫执行,要莫不执行

        一致性:即事务开始之前和事务结束之后,数据库的完整性约束没有被破坏

        隔离性:事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一刻的数据

        持久性:事务完成后,该事务对数据库所做的更改便持久的保存在数据库中,并不会回滚

5.事务日志以及其和四大特性的关系:

        Redo log(重做日志):提供再写入操作,恢复提交事务修改的页操作。

,用来保证事务的持久性

        undo log(回滚日志):回滚行记录到某个特定的版本,用来保证事务的原子性,一致性。   

redo的流程:保证事务的持久性

        第一步:先将原始数据从磁盘读取到内存中,修改数据的内存拷贝

        第二步:生成一条重做日志并写入redo log  buffer ,记录的是数据被修改后的值

        第三步:当事务commit时,将redo  log buffer  中的内容刷新到redo  log file采用追加写的方式。

        第四步:定期将内存中修改的数据刷新到磁盘中

undo日志:保证事务原子性和一致性。在事务中 更新数据的前置操作,其实时要先写入一个undo log

两种日志分别保证了,事务的持久性,与原子性,一致性,那个事务的隔离性又通过什么方式实现的呢

        首先,事务的隔离性,就是为了不同的事务之间不存在干扰,就需要对事务的操作进行隔离,也就是说事务的隔离性就是将操作同一个数据的事务互相分离,让操作之间分开有序的执行。

        Mysql数据库为保证隔离性,所以对时间采用加锁的机制。下面我们对锁的类型研究分析

6.MySQL中的锁
分类
基于锁的属性共享锁(s,读锁),排他锁(X,写锁)
基于锁的粒度表锁,行锁(记录锁,间隙锁,临键锁)
基于锁得状态意向共享锁,意向排他锁

在MySQL中,特别是针对InnoDB存储引擎,存在多种类型的锁,用于控制事务之间的并发访问,确保数据的一致性和隔离性。以下是一些常见的锁类型:

        1.共享性(s):也称读锁。当一个事务对某个数据项加了共享锁,其他事务可以同时对该数据项加共享锁,但不能加排他锁(写锁)。共享锁主要用于支持读取操作。

        2.排他锁(X):也称为写锁。当一个事务对某个数据项加了排他锁,其他事务不能对该数据项加任何类型的锁。排他锁主要用于支持写入操作,如更新,插入,删除数据。

        3.意向共享锁(IS):事务想要获取一个表上的多个行的共享锁时,可以在表级别加意向共享锁,这样可以减少锁的粒度,提高并发性能。

        4.意向排他锁(IX):事务想要获取一个表上的多个行的排他锁时,可以在表级别加意向排他锁。这种锁表明事务可能需要对这些行加排他锁。

        5.表锁:这种锁是在表级别上加的,通常用于MYISAM存储引擎,表锁包括表共享读锁,和表排他写锁,它们分别对应共享锁和排他锁。

        6.行级锁:这种锁是在行级别上加的,主要用于InnoDB存储引擎。行级锁包括记录锁,间隙锁和临键锁。这些锁主要用于实现MVCC(多版本并发控制)和避免幻读现象。

        7.乐观锁:这种锁机制假设并发冲突较少,事务在提交时才检查是否有冲突。通常通过版本号或时间戳来实现。

        8.悲观锁:这种锁机制假设并发冲突较多,事务在开始时就枷锁,以防止其他事务的修改。这种方式可能导致锁等待和性能下降。

在实际应用中,MySQL会根据事务的需要和配置参数自动选择合适的锁类型,以平衡并发性能和数据一致性。

7.行锁中,间隙锁,临键锁的介绍

        间隙锁:是InnoDB存储引擎用来解决幻读问题的一种锁机制,间隙锁锁定的是索引记录之间的间隙,或者是第一个索引记录之前或最后一个索引巨鹿之后的空间,而不是索引记录本身。

        间隙锁的作用:阻止其他事务在锁定的间隙内插入新的索引记录。这样当一个事务在执行范围查询时,即使其他事务尝试插入新的记录到这个范围内,也不会影响当前事务的查询结果,从而避免幻读。

        间隙锁的工作原理:

                1.锁定间隙:当一个事务执行一个带范围条件的查询语句,或者执行一个带范围条件的修改,或删除语句,InnoDB会锁定满足条件的索引巨鹿之间的间隙

                2.共享和排他锁间隙锁:间隙锁可以是共享的或排他的,共享间隙锁不会阻止其他事务获得共享间隙锁,但会组织排他间隙锁。排它间隙锁则会组织其他事务获得任何类型的间隙锁。

                3.间隙锁或索引:间隙锁只在事务隔离级别为 可重复读或序列化时使用。而且。间隙锁只在与某些类型的索引一起使用时才会生效。例如聚簇索引或辅助索引。

        临键锁:在MySQL中,临键锁是InnoDB存储引擎用来解决幻读问题的一种锁机制。临键锁是记录锁和间隙锁的组合,它不仅能锁定记录本身,还能锁定记录下一个值得间隙,从而防止其他事务在该间隙内插入新的记录。

        临键锁的作用:

                1.防止幻读:通过锁定记录下一个值的间隙,林间锁可以防止其他事务在该间隙内插入新的记录,从而避免了幻读现象。

                2.提高并发性能:临键锁的使用可以减少锁的竞争,提高系统的并发性能。

        临键锁的工作原理:

                临键锁是在记录锁的基础上扩展而来的。当一个事务执行一个带有范围条件的select查询语句,或者执行一个带范围条件的update和delete语句时,InnoDB不仅会锁定满足条件的索引记录,还会锁定这些记录下一个值得间隙。

        临键锁和间隙锁的注意事项:

              1.性能影响:间隙锁可能会增加锁竞争,从而影响性能。因此设计数据库时应该考虑索引的选择或事务隔离级别的设置。

                        2.死锁风险:由于间隙锁的存在,事务之间可能会发生死锁。例如,两个事务可能都试图锁定同一个间隙,导致互相等待。

                        3.锁的释放:间隙锁旨在事务提交或回滚时释放,而不是在语句执行完毕时释放。

通过使用间隙锁,MySQL的InnoDB存储引擎能够提供更高的事务隔离级别,同时尽可能地减少锁竞争,提高并发性能。然而,间隙锁的使用也需要谨慎,因为其可能引入死锁的风险,并对性能产生一定的影响。

8.事务的隔离级别:

          在事务并发执行时,如果不进行事务隔离,那么就会产生脏写,脏读,重复读,幻读的问题。所以MySQL为我们提供了不同的事务隔离级别。每个隔离级别都针对事务并发问题中的一种或几种继续宁解决,事务级别越高,解决的并发事务问题也就越多,同时意味着加的锁就越多,所以性能也会越差。

        1.read_uncommited  读未提交   :含义读取到未提交的数据,但是数据未提交,如果回滚,就会出现脏读

        2.read_comminted   读提交(不可重复读):读取到已提交的数据,(但是不能保证在数据变化之前你提交之前读过一次,两次数据有差异,会出现幻读,所以也叫不可重复读。)。

        3.repeatable_read   可重复读:可以重复读取数据,但是只有在两个事务都结束后,才能读取到正确数据,会出现幻读

        4.serializable     串行化 :这是为了解决幻读问题,第一个事务执行时,不允许第二个事务操作,只有前一个完成操作,后面下一个才会操作,保证数据了一致性。但是执行效率很低。

9.事务并发出现的问题:

对于SessionA 和SessionB  

        1.脏写:就是A 修改 了B 未提交 但修改过的数据,

        2.脏读:A 读取了  B 更新但还没提交的数据  若B回滚  A读取数据无效不存在, 

        3.不可重复读:A读取了一份数据后,B修改了数据,A再读,数据变了,这就叫不可重复读

        4.幻读:指在一个事务中多次执行相同的查询,但第二次返回的结果集比第一次多出了一些不存在的数据,

        避免幻读的方法:

                1.使用事务隔离级别:重复读,串行化

                2.使用锁:行级锁,间隙锁

                3.使用悲观锁,乐观锁

                4.使用事务的保存点和回滚

                5.使用数据库约束

                6.查询优化

10.MySQL的MVCC

        MySQL的多版本并发控制是一种用于实现事务隔离的技术,它允许多个事务在同一时刻对同一数据进行操作而不互相阻塞。MVCC通过维护数据的多个版本来实现这一点,每个事务看到的版本是基于该事务开始时的数据版本。

        基本原理:

        1.版本号:每个数据行都有一个隐藏的版本号,用于表示该行数据的版本。当一行数据倍修改时,其版本号也会被更新。

        2.读取操作:读取操作会读取符合其事务开始时版本号的数据版本。而不是最新的版本。这样可以保证事务在读取过程中看到的数据一致

        3.写入操作:写入操作会创建一个新的数据版本,并更新改行数据的版本号,旧的数据版本仍然保留,知道垃圾回收器清理。

       MySQL中MVCC的实现:

        mysql的InnoDB存储引擎使用了一种“乐观锁定”的技术来实现MVCC,包含以下机制:

        1.行班本链:每行数据都有一个版本链,包含该行数据的所有版本,每个版本都有关联的时间戳,表示该版本的创建时间。

        2.事务快照:每个事务在开始时会创建一个快照,记录当前所有的活动事务。事务在读取数据时,会使用这个快照来确定哪些数据版本是可见的。

        3.间隙锁:为了防止幻读,InnoDB使用了间隙锁,它可以锁定结果集之间的间隙,防止其他事务插入新的记录

        优点:        

        1.提高并发性能:MVCC减少锁的使用,提高系统的并发性能

        2.减少锁争用:由于每个事务看到的是自己快照中的数据版本,减少了锁争用情况

        3.简化事务管理:MVCC使得事务的管理和隔离更加简单和高效

        缺点:

        1.额外的存储开销:维护多个数据版本会占用更多的存储空间

        2.垃圾回收开销:需要定期清理不再需要的数据版本,否则回导致存储空间浪费

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

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

相关文章

SPIFFS与LittleFS的对gz文件格式的区别

SPIFFS 只能安装在Arduino上。LittleFS支持Arduino IDE和VScode的 PlatformIO。 SPIFFS serveStatic: server.serveStatic("/", SPIFFS, "/") 负责提供 SPIFFS 文件系统中的文件。您可以在 SPIFFS 上放置 .gz 文件,并该方法将自动处理它们。 …

git cz代码提交规范,适用于node14以上

1.效果 3. 在项目中如何添加 3.1 安装(只提供npm安装方式)全局安装 commitizen npm i -D commitlint commitlint/config-conventional commitizen cz-git 3.2 配置模版 在项目的根目录下配置添加文件 commitlint.config.js 并写入如下代码 /** type {import(cz-git).UserCo…

C# 类型转换

隐式(implicit)类型转换 1.不丢失精度的转换 2.显示(explicit)类型的转换 有可能丢失精度的转换 使用convert转换 ToString方法:将数值类型转换成字符串型

PDF密码移除技巧: 五大 PDF 密码移除器

如果您想解密或删除 PDF 密码,该怎么办?PDF 是一种经常用于商业的格式,您可以在培训、教育和商业场合使用它。添加这些 PDF 文件的密码可以保护您的安全和隐私。因此,有很多 PDF 都用密码加密,当您想要查看这些 PDF 时…

吃透张宇1000题和660题,能保底100分吗?

暑假已经过一半了,很多人都在埋头做题,如果你选择的是1000题660题 一定要好好看这篇笔记! 因为很多人做题做到现在,有点迷茫 主要的迷茫点有三个: 1、为什么1000题和660题也都做不少了,遇到新题&#x…

RS485 芯片SN65HVD72DR导致的死机问题调试

最近再一次栽倒在这颗RS485 芯片上了,硬件说这和芯片功耗有点高,要控下电源, 结果10次有9次程序死机! 先上图,请各位高手看看,这电路有问题没有? 为什么我会说是RS485 芯片导致的死机?因为 只要…

ai自动配音工具

AI拟音大师,给你的无声视频添加生动而且同步的音效 😝文件夹是一种基于文本的视频到音频生成框架,可以生成高质量的音频,在语义上相关,并与输入视频时间同步。 下载地址:https://pan.quark.cn/s/5a2be1cc5551

被工信部认可的开源软件治理解决方案

近日,工信部网络安全产业发展中心正式发布了“2023年信息技术应用创新解决方案”,开源网安凭借“基于SCA技术开源软件治理解决方案”顺利入选,成为经工信部认可的优秀解决方案,这是开源网安连续两届荣获此荣誉。 工业和信息化部网…

基于强化学习的Deep-Qlearning网络玩cartpole游戏

1、环境准备,gym的版本为0.26.2 2、编写网络代码 # 导入必要的库 import gym import torch import torch.nn as nn import torch.optim as optim import numpy as np from collections import deque import random# 定义DQN网络 class DQN(nn.Module):def __init__…

基于web的购物网站的设计与实现(系统源码+lw+部署文档+讲解等)

文字目录: 目录 详细视频演示 系统实现界面 1.1系统开发环境以及运行环境 1.1.1系统开发环境 1.1.2系统运行环境 1.2系统功能实现 1.3管理员模块实现 2 技术介绍 2.1 thinkphp5介绍 2.2 MySQL数据库 2.3 B/S结构 4.1系统结构设计 4.2系统功能结构设计…

如何挑选理想的报表工具?从入门到专业,测评十大热门工具的优缺点

报表能够用表格和图表等格式动态显示数据,因此衍生出相应的报表工具,已经有20年以上的发展历史了,期间报表工具不断随着需求的改变而更新迭代,今天博主就来推荐十款实用的报表工具,祝你轻松解决烦人的中国式复杂报表。…

【MySQL进阶】MySQL主从复制

目录 MySQL主从复制 概念 主从形式 一主多从 多主一从 双主复制 主从级联复制 主从复制原理 三个线程 两个日志文件 主从复制的主要工作模式 异步复制 半同步复制 全同步复制 MySQL主从复制 概念 MySQL主从复制是一种数据分布机制,允许从一个数据库服…

32.x86游戏实战-使用物品call

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【TDH社区版大事件】图分析、全文检索、小文件治理、数据开发工具通通都有!

星环科技大数据基础平台TDH社区版,在保留了商业版核心技术优势的基础上最大程度地降低了用户使用大数据技术的门槛与成本,具有更轻量、更简单、更易用等特性。 此次TDH社区开发版、社区版、社区订阅版均发布了新版本,带来新的产品组件和新的…

前端学鸿蒙有必要么?

在当今科技飞速发展的时代,前端开发领域也在不断演进和变革。那么,对于前端开发者来说,学习鸿蒙是否有必要呢? 一、前端学鸿蒙的必要性分析 1、鸿蒙开发简介 鸿蒙操作系统(HarmonyOS)是一个面向全场景的分布式操作系统,它不仅支持…

SX_c语言字符带空格字符串读写_9

改项目的时候又发现c语言读字符串的一些细节这里做补充其中%[^\n]可以读取带空格的字符串 #include <stdio.h>int main(){char cmd;scanf("%c", &cmd);char time[32] {0};scanf("%s", time);printf("%c\n", cmd);printf("%s&quo…

在IoT中的TCP增强

本文内容节选自一篇系统性文献综述&#xff08;Systematic Literature Review, SLR&#xff09;&#xff0c;标题为“TCP Performance Enhancement in IoT and MANET”&#xff0c;由 Sultana Parween 和 Syed Zeeshan Hussain 撰写&#xff0c;发表在《International Journal …

MySQL --- 内置函数介绍

目录 一、日期函数 二、字符串函数 三、数学函数 四、 其他函数 一、日期函数 current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime的日期部分date_add(date&#xff0c;interval d_value_type) 在date中添加时间/日期…

微信支付海外走红,中国企业跨境支付‘轻装上阵’

当我们谈论中国企业走向世界&#xff0c;拓展海外市场的征程时&#xff0c;一个不可忽视的助力者就是微信支付。它不仅是一个支付工具&#xff0c;更是连接中国企业和全球消费者的桥梁&#xff0c;让中国企业在海外也能享受到与国内同等的支付便利与信任。 早在2016年1 月 15 …

【Vue3】组件通信之$attrs

【Vue3】组件通信之$attrs 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…