MySQL 笔记 - 事务&锁

Mysql事务和锁原理——岁月云实战笔记 mysql通过WAL(Write Ahead Log,写前日志)来实现。如果事务提交了,但buffer pool中脏页没有刷盘,则从redo日志恢复。MySQL InnoDB 存储引擎中,即使事务尚未提交,某些情况下缓冲池(Buffer Pool)中的脏页也可能被刷写到磁盘。InnoDB 使用多个后台线程来管理缓冲池中的页面刷新,包括和。这些线程会定期检查缓冲池,将脏页刷新到磁盘,以确保缓冲池中有足够的干净页面用于新的读取操作。这个过程并不依赖于事务是否已经提交,这个时候就可以通过undo日志来保证。 阅读详情

事务

简单的说,事务就是一组原子性的 SQL 查询,这一组 SQL 要么全部执行成功,要么全部执行失败。这里简单介绍一下事务的 ACID,ACID 表示原子性、一致性、隔离性和持久性。

原子性:一个事务是不可分割的最小工作单元,整个事务要么全部成功,要么全部失败,不可能只执行中间的一部分操作。

一致性:执行事务是使得数据库从一个一致性状态到另一个一致性状态,如果事务最终没有被提交,那么事务所做的修改也不会保存到数据库中。

隔离性:通常来说,一个事务提交之前对其他事务是不可见的,但是这里所说的不可见需要考虑隔离级别,比如未提交读在提交前对于其他事务来说也是可见的,隔离级别,在下面会详细讲。

持久性:事务一旦被提交,那么对数据库的修改会被永久的保存,即使数据库崩溃修改后的数据也不会丢失。

隔离级别

SQL 标准中定义了四种隔离级别,这里简单介绍一下这四种隔离级别。

未提交读:未提交读的意思是,事务中的修改,即使没有提交,对其他事务也都是可见的,但是这样会出现脏读,一般情况下,通常都不会使用未提交读。

提交读:提交读的意思是,一个事务所做的修改在提交之前对其他事务都是不可见的,这个级别也叫做“不可重复读”,因为执行两次相同的操作,可能会得到不同的结果。

可重复读:可重复读解决了脏读的问题,这个级别保证了同一个事务多次读取同样记录的结果是一致的,但是这个隔离级别无法解决幻读的问题,所谓幻读就是说,当某个事务读取范围数据时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围数据时,会产生幻行。InnoDB 存储引擎通过 MVCC 解决了幻读的问题,可重复读是 MySQL 默认的事务隔离级别。

可串行化:是最高的隔离级别,避免了前面说到的幻读问题。可串行化会给读取的每一行都加锁,所以可能导致大量超时和锁争用的问题,实际中很少使用这个隔离级别。

死锁

死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源。解决死锁的方法就是回滚一个或者多个事务。

MVCC

MVCC 可以看做是行锁的一个变种,在很多情况下 MVCC 可以避免加锁,因此开销更小,不同事务型存储引擎对于 MVCC 的实现各有不同。

MVCC 的实现是通过保存数据在某个时间点的快照来实现的。也就是说,不管执行多长时间,每个事务看到的数据都是一致的。根据事务的开始时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。这里简单介绍一下 InnoDB 的 MVCC。

InnoDB 的 MVCC 通过在每行记录后面保存两个隐藏的列来实现。这两个列,一个保存了行的创建时间,一个保存了行的过期时间,存储的不是实际的时间,而是版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号作对比。下面详细介绍一下在可重复读隔离级别下,MVCC 的具体操作。

SELECT

InnoDB 会根据以下两个条件检查每条记录:

只查找版本小于等于事务版本号的行

只查找未定义删除时间或者删除时间大于事务版本号的行

INSERT

InnoDB 为新插入的每一行保存当前的系统版本号作为行版本号

DELETE

InnoDB 为删除的每一行保存当前的系统版本号作为行的删除版本号

UPDATE

InnoDB 新增一条记录,保存当前系统版本号作为新增行的版本号

在被删除记录的原始行,保存当前系统版本号作为被删除记录行的删除版本号

优点:

因为有了两个隐藏列来记录数据的状态,所以大多数读操作都可以不加锁

性能好,同时可以保证读取的数据是正确的

缺点:

需要额外的空间记录每行的状态

需要行状态的维护和检查

如何解决幻读

MVCC 解决幻读的时候使用了间隙锁,也就是 next-key lock,这部分就要先从 InnoDB 的三种行锁说起:

Record Lock:单个行记录上的锁,锁住的是索引

Gap Lock:区间锁,锁定一个区间范围,但不包括记录本身,开区间

Next-Key Lock:间隙锁,Record Lock + Gap Lock

举个简单的例子,

selectidfromuserwhereid>15andid<30复制代码


13467292-b40e1169265bcd19.png

图示清楚的表示了间隙锁~

进群:可以领取免费的架构师学习资料。

进群:了解最新的学习动态

进群:了解最新的阿里,京东招聘资讯

进群:获取更多的面试资料

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。

5. 群号:835638062 点击链接加入群:https://jq.qq.com/?_wv=1027&k=5S3kL3v

6.阿里Java高级大牛直播讲解知识点,分享知识,上面五大专题都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

IGBT单管并联方案全解析:从均流设计到热管理实战技巧 本文深入解析了IGBT单管并联技术在新能源车电驱系统中的应用,重点探讨了均流设计与热管理实战技巧。通过优化寄生电感控制、动态均流和驱动电路设计,提升系统稳定性和效率,为工程师提供了一套完整的解决方案。 阅读详情

相关推荐

在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记

日期:2025-09-09关键词:鲲鹏920、Atlas 300i Duo、银河麒麟V10、NPU、驱动、固件。

weixin_41544125的博客 2821

MySQL的锁机制,Java中关于表锁和行锁的使用

数据库提供了行级锁和表级锁来管理并发访问,在Java程序中,可以通过数据库的锁机制来控制对表的并发访问。数据库锁机制需要配合事务一起使用,锁的释放依赖事务的结束,如commit或者rollback。表级锁是一种数据库级别的锁机制,属于一种悲观锁机制,它要求在同一时刻只允许一个事务对整张表进行修改。通过LOCK TABLE语句锁定整个表,避免多个事务并发对表中的数据进行修改。

优快云_YYD_997的博客 1478

Mathtype公式下标深度调整技巧:解决固定行距下的显示不全问题

本文针对在Word等文档中设置固定行距时,Mathtype公式下标显示不全的问题,提供了专业解决方案。核心在于调整Mathtype软件内部的“下标深度”参数,通过修改单个公式或批量格式化全文,使公式完美适配固定行距,确保下标清晰完整,且不影响文档整体排版。

pepsi的博客 1503

java中间件 - MySQL事务和锁机制和MVCC

面试官:你是怎么理解InnoDB引擎中的事务的? 候选者:在我的理解下,事务可以使「一组操作」要么全部成功,要么全部失败 候选者:事务其目的是为了「保证数据最终的一致性」。 候选者:举个例子,我给你发支付宝转了888块红包。那自然我的支付宝余额会扣减888块,你的支付宝余额会增加888块。 候选者:而事务就是保证我的余额扣减跟你的余额增添是同时成功或者同时失败的,这样这次转账就正常了 面试官:嗯,那你了解事务的几大特性吗? 候选者:嗯,就是ACID嘛,分别是原子性(Atomicity)、一致性(Consi

sinat_36387539的博客 241

echarts实现3D地图——map3D

【代码】echarts实现3D地图——map3D。

xiaoququ的博客 7324

iSLIP算法实战:如何用Python模拟交换机优先级匹配(附完整代码)

本文详细介绍了如何使用Python实现iSLIP算法,模拟交换机优先级匹配过程。通过核心的指针滑动逻辑和迭代循环策略,构建了一个完整的iSLIP算法模拟器,并加入可视化模块以直观展示匹配过程。文章还提供了完整的代码框架和性能优化建议,适合网络工程师和Python开发者直接集成到测试环境中。

weixin_29313239的博客 253

闲聊Mysql的锁与事务和java中的锁机制

主要参考文章:https://tech.meituan.com/innodb-lock.htmlhttp://blog.youkuaiyun.com/soonfly/article/details/70238902这篇文章主要侧重Innodb引擎~Innodb引擎为了保证事务的一致性、隔离性以及数据在并发读-读、读-写、写-写的情况下的正确性,用到的技术有:悲观锁(表锁、行锁、GAP间隙锁)、MVCC(快照读、

joenqc的博客 6376

基于Simulink的无迹卡尔曼滤波(UKF)SOC高精度估计仿真

本文介绍了基于Simulink的无迹卡尔曼滤波(UKF)在电池SOC高精度估计中的应用。通过无迹变换替代传统EKF的线性化过程,UKF显著提升了SOC估计精度,在强非线性工况下误差可控制在0.5%以内。文章详细阐述了UKF的核心原理,包括Sigma点生成、状态预测和观测更新等关键步骤,并基于Thevenin等效电路模型构建了完整的UKF SOC估算系统。通过Simulink建模和仿真验证,展示了UKF在大电流脉冲、变温工况等复杂场景下的优异性能,其动态响应时间小于30ms,长期累积误差低于0.7%。研究为储

amy_mhd的博客 125

MySQL 自学重点笔记分享 - 事务&锁

事务 简单的说,事务就是一组原子性的 SQL 查询,这一组 SQL 要么全部执行成功,要么全部执行失败。这里简单介绍一下事务的 ACID,ACID 表示原子性、一致性、隔离性和持久性。 原子性:一个事务是不可分割的最小工作单元,整个事务要么全部成功,要么全部失败,不可能只执行中间的一部分操作。 一致性:执行事务是使得数据库从一个一致性状态到另一个一致性状态,如果事务最终没有被提交,那么事务所做的修改也不会保存到数据库中。 隔离性:通常来说,一个事务提交之前对其他事务是不可见的,但是这里所说的不可见需要考虑

XingXing_Java的博客 1008

鸿蒙开发实战项目(四十七):图片编辑(ArkTS)

本篇Codelab主要介绍如何基于图片编解码,实现图片编辑。图片的解码。使用PixelMap进行图片编辑,如裁剪、旋转、亮度、透明度、饱和度等。图片的编码。

斌擎科技 1587

时间门控拉曼进展

拉曼光谱就像是用光给分子拍“指纹照”,通过激光照射样品,散射光会揭示样品的分子结构。但问题来了,样品有时会发荧光,就像拍照时闪光灯太亮,把指纹照模糊了。时间门控拉曼光谱技术就像加了个“快门”,只在拉曼信号出现的那一瞬间开门,把慢吞吞的荧光挡在门外,这样就能拍到清晰的“指纹”。

qq_53529450的博客 538

MySQL深入学习——第三章 事务&锁由浅入深笔记

一、数据库锁 1、锁的简介 为什么需要锁? 到淘宝上买一件商品,商品只有一件库存,这个时候如果还有另一个人买,那么如何解决是你买到还是另一个人买到的问题? 锁的概念:锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。锁对数据...

hankin的博客 429

TIBCO Jaspersoft Studio报表开发 使用教程-进阶版

本文学习内容容器定制二级目录三级目录 容器定制 二级目录 三级目录

吉哲的博客 7521

mysql事务笔记_MySQL 笔记 - 事务&锁(越基础越值得一看)

写在前面这是一篇读(重)书(点)笔(摘)记(要)~内容为《高性能 MySQL》小基础更值得看~小编学习MySQL时候一些心得,可以借鉴一下哦MySQL学习经验分享​note.youdao.com事务简单的说,事务就是一组原子性的 SQL 查询,这一组 SQL 要么全部执行成功,要么全部执行失败。这里简单介绍一下事务的 ACID,ACID 表示原子性、一致性、隔离性和持久性。原子性:一个事务是不可分...

weixin_36328790的博客 81

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex&trade;-M4F 内核的信息,请参见《Cortex&trade;-M4F 技术参考手册》。

Mysql进阶-事务&锁

事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加 1000。这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行 数据是否加锁,使用意向锁来减少表锁的检查。

weixin_64133130的博客 1521

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MySQL事务和锁

MySQL的事务和锁:事务四大特性、事务并发的三个问题,InnoDB锁

m0_54355172的博客 6100

MySql 事务 & 锁

一组逻辑操作单元,使数据从一种状态变换到另一种状态。保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

cimbala的博客 830

MySQL事务和锁的使用

主要介绍MySQL中的事务和锁的基本使用,包括事务的四大特性,MVCC等 含有锁的分类,锁的基本介绍

热爱编程的菜鸟 4694

MySQL -事务、锁

MySQL事务以及锁

weixin_64612849的博客 1091

MySqL 事务与锁的深入学习笔记

之前学习MySql的简单使用的时候.学习了事务的概念,事务的隔离级别,以及何时使用事务,怎么使用事务等等比较简单的东西。最近不停的在想数据库内部是如何实时事务的,如何避免脏数据的。数据库内部是否有与并发编程中的相似的锁概率呢。Google查阅了相关资料后,记录一下学习笔记。mysql的锁  锁的概率:某个链接对某个资源(可以是一张表,也有可能是一行或者多行记录)进行加锁操作,根据锁的不同功能,决定在

不能说的秘密的博客 9725

【MySQL】事务、锁

MySQL数据库事务和锁

低调做人,低调编码,神码都是浮云 1753

【MySQL】剖析事务和锁

使用事务而不是使用 LOCK TABLES 语句手动加锁,并使用 innodb_lock_wait_timeout 变量设置锁的超时时间,保证任何情况下锁都可以自动释放。 经常使用 SHOW ENGINE INNODB STATUS 命令来确定最近一次死锁的原因。这可以帮助我们修改应用程序以避免死锁。 如果出现频繁的死锁警告,可以通过启用 innodb_print_all_deadlocks 变量来收集调试信息。对于死锁的信息,都记录在 MySQL 错误日志中,调试完成后记得禁用此选项。 如果事务由于死锁而

2302_79806056的博客 1116

MySql的事务和锁详解

数据库事务详细说明,事务实现原理,锁类型,锁的使用,MVCC多版本控制,分布式事务概要说明等

m0_37685866的博客 2018
上一篇: Nginx+Redis+Ehcache:大型高并发与高可用的三层缓存架构总结
下一篇: MySQL 笔记 - 索引优化
普通网友
博客等级 码龄8年 55粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值