mysql 事务及隔离级别,锁

MySQL事务隔离级别 本文主要探讨MySQL事务隔离级别的使用,具体什么场景使用啥,实战验证出现的并发事务问题 阅读详情

1. 事务特性:ACID

  1. 原子性: 回滚日志(undo log)
  2. 持久性: 重做日志(redo log)
  3. 隔离性: 锁+mvcc(当前读)
  4. 一致性:(通过AID及用户自定义完整性保证)
    一致性是事务追求的最终目标:前面提到的原子性、持久性和隔离性,都是为了保证数据库状态的一致性。此外,除了数据库层面的保障,一致性的实现也需要应用层面进行保障(转账)。

一致性是指事务执行结束后,数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。数据库的完整性约束包括但不限于:实体完整性(如行的主键存在且唯一)、列完整性(如字段的类型、大小、长度要符合要求)、外键约束、用户自定义完整性(如转账前后,两个账户余额的和应该不变)。不同于CAP的一致性,CAP的一致性指的是多个节点数据保持一致,

2. 事务隔离级别

在这里插入图片描述

未提交读(问题:脏读)-> 提交读(问题:不可重复读)-> 可重复读(默认)(问题:幻读 )-> 串行化或者mvcc(读)及X锁+gap锁(写)

幻读
指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row). —高性能mysql(权威)

不可重复度
一个事务内两次读之间,另一个事务修改了数据,两次读的内容不一样

可重复读
一个事务启动的时候,能够看到所有已经提交的事务结果。但是之后,这个事务执行期间,其他事务的更新对它不可见

mysql如何实现避免幻读

  • 在快照读读情况下,mysql通过mvcc来避免幻读
  • 在当前读读情况下,mysql通过next-key来避免幻读

mvcc

InnoDB 的MVCC ,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number) 。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。下面看一下在REPEATABLE READ 隔离级别下, MVCC 具体是如何操作的。

SELECT
InnoDB 会根据以下两个条件检查每行记录:
a. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号)这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。
b.行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。
只有符合上述两个条件的记录,才能返回作为查询结果。
INSERT
InnoDB 为新插入的每一行保存当前系统版本号作为行版本号。
DELETE
InnoDB 为删除的每一行保存当前系统版本号作为行删除标识。
UPDATE
InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统 版本号到原来的行作为行删除标识。

什么是next-key锁

可以简单的理解为记录锁(X锁(排他锁))+GAP锁

什么是快照读和当前读

  • 快照读:一致性读,当我们查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新的结果,而不能看到这个时间点之后事务提交的更新结果。
    简单的select操作,属于快照读,不加锁

select * from table where ?;

  • 当前读:当前读就是读取最新数据,而不是历史版本的数据
    特殊的读操作,插入/更新/删除操作,DML 操作,属于当前读,需要加锁。

select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;

行锁

在这里插入图片描述

间隙锁

间隙锁之间都不存在冲突关系,间隙锁的引入,可能会导致同样的语句锁住更大的范围,这其实是影响了并发度的 。可重复读隔离级别下才会生效的

3. 锁

锁类别

表级锁(alter table,LOCK TABLES users READ),myisam仅支持表锁
行级锁(Record Lock)
间隙锁(Gap Lock)
Next-key Lock:(Record Lock + Gap Lock)
共享锁
排它锁:普通select不会加锁,所以某个事务在一行加排它锁,其他事务的普通select能执行,只是查询的是老数据
意向共享/排它锁

意向锁:

作用:一个任务想要获取表级别的应用共享或排它锁,则受到由第一个任务控制的表级别意向锁的阻塞。第二个任务在锁定该表前不必检查各个页或行锁,而只需检查表上的意向锁。

innoDB 支持多粒度的锁,允许表锁和行锁的并存,为了方便多粒度锁冲突的判断,innoDB 中还存在一种名叫意向锁(Intention Locks)的锁

取得行的共享锁和排他锁之前需要先取得表的意向共享锁(IS)和意向排他锁(IX),主要是用来辅助表级和行级锁的冲突判断,因为 Innodb 支持行级锁,如果没有意向锁,则判断表锁和行锁冲突的时候需要遍历表上所有行锁,有了意向锁,则只要判断表是否存在意向锁就可以知道是否有行锁了

意向锁,表级别的锁
意向锁不会与行级的共享 / 排他锁互斥!!!
在这里插入图片描述

在这里插入图片描述

MySQL_索引、锁、事务特性、事务隔离级别 一、为什么要使用索引二、什么样的信息能成为索引三、索引的数据结构四、密集索引和稀疏索引的区别索引1.如何定位并优化慢查询Ⅰ.根据慢日志定位慢查询SQLⅡ.使用explain等工具分析SQLⅢ.修改SQL或者尽量让SQL走索引2.联合索引的最左匹配原则的成因3.索引是建立的越多越好吗锁模块常见问题1.MyISAM与InNoDB关于锁方面的区别是什么2.数据库事务的四大特性3.事务隔离级别以及级别下... 阅读详情

相关推荐

判断两个多边形是否相交(java实现)

判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景

IT_CREATE的博客 5844

mysql-事务隔离级别以及锁详解

一、事务的隔离级别 什么是事务、事务有哪些特性 事务的隔离级别有哪些?默认的隔离级别是什么? 在设置可重复读的情况下,如何保证修改的是最新的数据? mysql中设置事务隔离级别以及事务的操作 二、锁 说说mysql中有那些锁? innodb有哪些行锁算法 innodb如何选择行锁与表锁 什么是死锁?怎么解决死锁问题? 事务与锁状态信息查看

Promise_J_Z 3603

PICO SCOPE 二次开发

基于C#开发一个简单的PICO示波器的上位机工作,与MCC600运动控制卡一起,实现数据自动采集

nixoncheng的博客 1147

记-数据库事务隔离级别

记-数据库事务隔离级别 一、MySQL数据库默认隔离级别 二、JDBC连接的事务隔离级别 1. 查看JDBC连接的事务隔离级别 2. JDBC连接的事务隔离级别设置过程 三、修改JDBC连接的事务隔离级别 1. 全局修改 2. 局部修改

搬山境KL攻城狮的修炼手册 2156

优化求解器性能:当分支切割算法中的gap停滞不前时如何应对

本文深入探讨了当分支切割算法求解复杂整数规划问题时,gap停滞不前的根本原因与应对策略。文章指出gap停滞源于上界(找不到更优整数解)或下界(证明过程缓慢)提升受阻,并提供了从模型改写、自定义割平面、调整搜索策略到参数调优等一系列实战方法,帮助优化工程师有效打破求解僵局,推动gap下降。

weixin_29294597的博客 381

手把手教你用思岚RPLIDAR C1激光雷达实现简单环境扫描(树莓派4B+Ubuntu22.04)

本文详细介绍了如何在树莓派4B(Ubuntu 22.04系统)上驱动思岚RPLIDAR C1激光雷达,从硬件连接、权限配置、SDK编译到运行示例程序,最终实现环境扫描数据的可视化。通过手把手教程,帮助开发者和爱好者快速上手激光雷达应用,构建简单的环境扫描图。

j2k3l4的博客 1130

mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置

事务基于数据库连接,我们将一个数据库会话看作一个事务):session A、session B、session C。会话范围:对当前会话的后续的事务有效,对之前的事务无效;思考1:设置了global的有效范围,当前会话查看应该仍然是 repeatable-read;因为我们之前说过global对于当前存在的会话是不会生效的,之后新的会话才有效;根据结果,上面的思考预期是正确的,我们的理论也是得到了验证;重启数据库可以自己验证。全局范围和会话范围都是基于内存的,重启mysql之后又会回到默认的隔离级别。

qq_41544627的博客 9196

Dify知识库文档批量下载神器:一键导出所有文件到本地

在使用Dify进行知识库管理的过程中,我们经常遇到一个实际问题:如何将已上传到知识库中的文档批量下载到本地?目前Dify的管理界面虽然功能强大,但暂时没有提供直接的UI界面来批量导出或下载知识库内的文档。这意味着如果我们需要将知识库中的文件备份到本地或进行离线处理,只能通过API接口来实现。本文将详细介绍如何利用Dify的REST API构建一个完整的知识库文档下载解决方案,这也是目前实现知识库文件批量下载到本地的唯一可行路径。🎉进入大模型应用与实战专栏 | 🚀查看更多专栏内容首先,我们需要在Dify的

羊城迷鹿的博客 3473

一篇文章彻底搞懂Mysql事务隔离级别与锁机制(深度剖析)

主要讲解了事务隔离级别、ACID、并发事务带来的问题、表锁、行锁、间隙锁、用SQL案例模拟事务隔离级别,深入理解

大尾巴狼学编程的博客 3682

❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)

文章目录强烈推荐系列教程,建议学起来!!一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分

全栈川川 26万+

华为OD机试 - 小扇和小船的数字游戏 - 二进制(Python/JS/C/C++ 2024 C卷 200分)

二进制表示:任何数 n 的二进制表示中,要找到下一个有相同数量的1的数,我们需要在最低位的0后面的最低位的1进行操作。右侧交换法则:找到右侧的第一个0,位于第一个1的左边,将这个0变成1(提升这个位),并将这个1变成0(下移这个位)。调整尾部1:为了得到最小的数,将所有低于已交换的1的位重置,使得所有1尽可能靠右。

学Java,找哪吒 1161

Mysql 事务隔离级别和锁的关系

我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析 MySQL中 InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 一、一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些

程序猿进阶 1794

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4009

MySQL 事务隔离级别和锁

事务及其特性 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务的使用是数据库管理系统区别文件系统的重要特征之一。 事务拥有四个重要的特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),人们习惯称之为 ACID 特性。下面我逐一对其进行解释。 IBM Compose for MySQL IBM Cloud 上提供的 Compose for MySQL 数据库服务可以帮助您更好地

ylx1066863710的博客 181

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

mysql 事务隔离 锁_MySQL事务隔离级别和锁

MySQL事务隔离级别和锁表结构createtablerecord(idintauto_incrementprimarykey,titlevarchar(255)notnull,shortNamevarchar(255)notnull,authorIdintnotnull,createTimedatetimenotnull,stateintnotnull...

weixin_39918588的博客 162

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MySQL事务和锁之事务隔离级别

MySQL的事务隔离级别

丿涛哥哥的博客 693

Mysql事务隔离级别与锁

数据库的事务有几种特性,例如一致性和隔离性,一般通过加锁来实现。同时数据库又是一个高并发的应用,如果加锁过度或者不当将严重影响性能。数据库提供了几种隔离级别来供选择,本文通过解析InnoDB的加锁机制是如何实现几种隔离级别,来更深刻的理解mysql的锁。    两阶段锁     首先,事务的所操作分为两个阶段:加锁和解锁,两者不想交。因为事务开始时,并不知道会用到哪些数据,所以加锁阶段

end's coding life 6298

mysql事务隔离级别与锁

MySQL的四种事务隔离级别 事务的基本要素(ACID)   1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。   2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。    3、隔离性(Isolation..

H291850336的专栏 595

一文读懂mysql事务隔离级别和锁的关系

预备知识 ​ mysql5.5以上版本中默认使用的存储引擎是基于InnoDB,所以本文所有关机都是基于InnoDB存储引擎。 锁 行锁:顾名思义,该锁锁住的是表中数据的某一行数据,共享锁和互斥锁都属于行锁。另外行锁可以使用的前提条件是SQL语句必须使用到了索引(如果不知道何为索引,可以先了解一下,当然不了解也不影响理解后面的知识),否则不会使用行锁,而是使用表锁。 共享锁(S):共享锁也称为读锁,共享锁和共享锁之间是兼容的,但和排他锁不兼容。什么意思呢?假设事务A加了一个共享锁,那么事务B是可以申请共享

qq_41885278的博客 1118

Mysql锁与事务隔离级别

Mysql锁与事务隔离级别概述事务及ACID属性并发事务处理带来的问题更新丢失(Lost update)或脏写脏读(Dirty Reads)不可重复读(Non-Repeatable Reads)幻读(Phantom Reads)事务隔离级别锁详解锁分类串行化解决幻读间隙锁(Gap Lock)临键锁(Next-key Locks)无索引行锁会升级为表锁 文章引自图灵,用于自学。 概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏读、脏写

yz_ylfc的博客 522

MySQL Innodb中的事务隔离级别和锁的关系15

前言 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到

2401_89488159的博客 1021

MySQL Innodb中的事务隔离级别和锁的关系5

我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。

STC91s的博客 863

MySQL 中索引、锁、事务、隔离级别与并发读问题的深层关联

索引决定锁的粒度,是高性能的基础。事务是锁的载体,控制锁的生命周期。隔离级别通过不同的锁策略,平衡一致性与性能。锁是解决并发读问题的核心手段。理解这些组件的内在联系,才能在设计高并发系统时做出合理的选择。记住:没有万能的解决方案,只有针对特定场景的最优策略。

weixin_43521001的博客 951

MySQL InnoDB 事务隔离级别和锁

READ COMMITTED(读取已提交)和REPEATABLE READ(可重复读)的读,会根据 MVCC 机制,读历史版本数据(不同的是版本的定义不同)根据锁的粗粒度,还有意向锁(InnoDB事务并发决策用的,可以不用关注)根据事务隔离级别不同,可能为行锁,或升级为间隙锁。非唯一索引的 SQL 语句,均可以升级为间隙锁。

范安崇的博客 569

MySQL的四种事务隔离级别以及各种锁的问题

MySQL的四种事务隔离级别 事务的四大特性ACID 1.原子性(Atomicity):一个事务要么全部执行,要么全部不执行,如果执行过程中出现异常则回滚;犹如化学中的原子一样具有不可分割性(别跟我较真啊,虽然原子又可以分为质子、中子、电子等); 2.一致性(Consistency):事务的一致性则是指事务的开启前后,数据库的完整性约束并没有被破坏;即A向B转账,转账前后A和B的总金额还是不变的;...

qq_39495922的博客 4548

MySQL Innodb中的事务隔离级别和锁的关系1

我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。

AKE2014的博客 770
上一篇: tcp挥手,拥塞控制
下一篇: mysql 索引
big muscle
博客等级 码龄11年 145粉丝 71原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值