MySQL事务隔离及锁机制

MySQL的事务隔离级别、锁机制、MVCC的原理 MVCC(Multi-Version Concurrency Control,多版本并发控制)是 MySQL中 InnoDB 引擎实现高并发访问的核心机制,通过数据多版本化解决读写冲突,实现非阻塞读取。MVCC 相对于为每个修改保存一个版本,版本与事务时间戳关系,读操作只读该事务开始前的数据库的快照。它是通过数据库记录中的隐式字段 Undo Log、Read View 实现的。MVCC 可以很好地平衡好性能和数据安全性之间的关系,在不加锁的情况下避免多事务竞争带来的不可重复读、脏读、幻读的问题。 阅读详情

一、事务及其AICD属性

事务是由一组sql组成的逻辑处理单元,具有其四种属性:

1.原子性

事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。

2.一致性

在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性。

3.隔离性

数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。

4.持久性

事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

二、并发事务处理带来的问题及事务隔离级别

事务隔离级别总体简介

隔离级别脏读不可重复读幻读
读未提交可能可能可能
读已提交不可能可能可能
可重复读不可能不可能可能
可串行化不可能不可能不可能

准备示例表:

CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`balance` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test`.`account` (`name`, `balance`) VALUES ('aaa', '450');
INSERT INTO `test`.`account` (`name`, `balance`) VALUES ('bbb', '160');
INSERT INTO `test`.`account` (`name`, `balance`) VALUES ('ccc', '240');

1.脏读

a.介绍

一个事务对一条数据进行修改,当前事务未提交时,另一个事务读取了这条数据修改前后的值,导致读取的值不同。现象如下:
分别开启客户端A
由于mysq事务隔离级别l默认开启的是可重复读,所以为了演示脏读现象,则需要开启读未提交

#开启读未提交的事务隔离级别
set tx_isolation='read-uncommitted';
begin;
select * from account;

在这里插入图片描述
结果如上图,客户端A不要关闭。
开启客户端B

set tx_isolation='read-uncommitted';
begin;
update account set name='a1' where id =1;
select * from account;

在这里插入图片描述
如上图所示:客户端B将id为1的name值修改为a1,当前事务未提交,也就是数据库中存的值还是aaa。
我们再打开客户端A,继续查询表中的值:
在这里插入图片描述
由上图可看出,客户端B开启事务进行修改数据,未提交事务时,客户端A可以读取客户端B修改后的值。这明显有问题。

b.解决方式

mysql数据针对脏读问题,提供读已提交的事务隔离级别。
客户端A

#读已提交
set tx_isolation='read-committed';
begin;

在这里插入图片描述
客户端B

#读已提交
set tx_isolation='read-committed';
begin;
update account set name='a1' where id =1;

修改值后,未提交事务:
在这里插入图片描述
客户端A:查询表信息,看是否更改。从下图可以看出,在客户端B未提交事务时,客户端A这里查询不到变化。
而当客户端B提交事务后,客户端A可以查询到变化(在读已提交的事务隔离级别下,读取的是数据库的实时数据)。而这又导致另一个问题:不可重复读。
在这里插入图片描述

2.不可重复读

a.介绍

当一个事务修改了数据,提交事务后,导致另一个事务再读数据时,前后读取的值不一致。这种现象违反事务彼此的隔离性。

b. 解决方式

mysql为了解决可重复读,提供可重复读的事务隔离级别

#开启可重复读
set tx_isolation='repeatable-read';

打开客户端A、B按上面方式进行验证。

3.幻读

a.介绍

同时打开客户端A、B,分别开启事务;当客户端A事务新增一条数据,提交事务后,客户端B查询整个表记录是查询不到客户端A新增的那条记录的。但是,当在客户端B执行更新新增的那条记录时,居然成功。这种现象就是幻读。

b. 解决方式

可启动可串行化隔离级别,解决幻读问题

#开启可串行化
set tx_isolation='serializable';

打开客户端A、B按上面方式进行验证。
验证后,会发现:当客户端A执行查询时未提交事务的情况下,客户端B不能对客户端A事务查询的数据做操作。
当开启可串行化后,事务中对数据操作时,会对操作行进行加锁,再提交事务,释放锁后,其他事务才能对该数据进行操作。

三、锁

  • 从性能上分为乐观锁(用版本对比来实现)和悲观锁
  • 从对数据库操作的类型分,分为读锁和写锁(都属于悲观锁)
  • 读锁(共享锁,S锁(Shared)):针对同一份数据,多个读操作可以同时进行而不会互相影响
    写锁(排它锁,X锁(eXclusive)):当前写操作没有完成前,它会阻断其他写锁和读锁
  • 从对数据操作的粒度分,分为表锁和行锁

1.行锁

每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

2.表锁

每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。

  • 手动增加表锁
    lock table 表名称 read(write),表名称2 read(write);
  • 查看表上加过的锁
    show open tables;
  • 删除表锁
    unlock tables;

3.间隙锁

客户端A、B开启可重复读隔离级别,同时开始事务,在客户端B执行范围更新操作,在客户端A执行插入范围内的数据,需要等待客户端B的事务提交后才能执行成功。
客户端A
在这里插入图片描述
客户端B
在这里插入图片描述
由上图看出,表中记录id间隙有(4,7),9,(10,正无穷),客户端B执行id范围(0,8)的数据更新,涉及到的间隙范围有(4,7),则会将其范围内的记录加锁,这就是所谓的间隙锁。
如果记录id的间隙为(5,9),(12,30),(40,正无穷),而客户端执行id范围(8,20)的数据更新,涉及到的间隙范围有(5,9),(12,30),会将这些范围内的记录都加锁,其他事务无法对其修改、新增。

4.临键锁(Next-key Locks)

Next-Key Locks是行锁与间隙锁的组合。像上面那个例子里的这个(4,7]的整个区间可以叫做临键锁。

5.无索引行锁会升级为表锁

  • 锁主要是加在索引上,如果对非索引字段更新,行锁可能会变表锁
    session1 执行:update account set balance = 800 where name = ‘lilei’;
    session2 对该表任一行操作都会阻塞住
    InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁。

四、查看INFORMATION_SCHEMA系统库锁相关数据表

 ‐‐ 查看事务
select * from INFORMATION_SCHEMA.INNODB_TRX;
‐‐ 查看锁
select * from INFORMATION_SCHEMA.INNODB_LOCKS;
‐‐ 查看锁等待
select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

‐‐ 释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到
kill trx_mysql_thread_id

‐‐ 查看锁等待详细信息
show engine innodb status\G;
MySQL——事务隔离机制与锁机制 MySQL事务隔离机制与锁机制详解 阅读详情

相关推荐

【MySQL】深入理解MySQL事务隔离级别与锁机制

尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁 合理设计索引,尽量缩小锁的范围 尽可能减少检索条件范围,避免间隙锁 尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的SQL尽量放在事务最后执行 尽可能低级别事务隔离

金鳞踏雨 1598

数据库事务ACID以及隔离级别

数据库事务隔离级别

a347635191的博客 2525

支付宝支付(三):周期扣款实现注意细节

一、周期扣款实现说明 1、官方文档入口:https://opendocs.alipay.com/open/20190319114403226822/intro 2、根据官方文档说明,周期扣款有两种方式:先签约后代扣场景和支付后签约场景 3、周期扣款接入问题文档: a>https://opendocs.alipay.com/support/01rg24 b>https://opensupport.alipay.com/support/knowledge/50249/20160248753

新鲜雾霾的博客 5698

mysql的四大特性(AICD)

1.原子性(atomicity) 事务是执行的最小单位,不允许分割,其中的操作要么都做,要么都不做。 2.一致性(consistency) 执行事务前后,数据处于一种合法的状态 3.隔离性(isolation) 并发执行的事务之间互不干扰 4. 持久性(durability) 事务一旦被提交,对数据库中数据的改变是永久的 ...

EdmundBai的博客 2028

从零搭建A股量化交易系统:开源框架选型与实战部署指南

本文详细介绍了从零搭建A股量化交易系统的完整流程,重点分析了开源框架VNPY和QMT的选型与实战部署。内容涵盖系统架构设计、策略开发、性能优化及实盘过渡方案,为开发者提供了一套完整的A股实盘量化交易解决方案,助力高效构建稳定可靠的量化交易系统。

sugar的博客 1271

2023-07-04 Fast-Lio论文中公式(6)与BCH公式中近似雅可比公式的一致性推导

将(1)式代入(6)式,就有。

wmorries的博客 475

数据库小记-AICD

隔离性(Isolation):隔离性确保每个事务在并发执行时都相互隔离,就像它在独立执行时一样。它们确保事务在数据库中的执行是可控的,可以在各种故障情况下保持数据的完整性。原子性(Atomicity):原子性确保事务中的所有操作要么全部完成,要么全部不完成。原子性确保事务的操作是不可分割的单元,要么全部成功,要么全部失败。如果事务违反了完整性约束,它将被回滚,数据库状态不会被破坏。持久性(Durability):持久性确保一旦事务提交,其结果将永久保存在数据库中,即使在系统发生故障或崩溃时也是如此。

qq_40140808的博客 675

YOLOV8主干改进方法:C2f-Dual——DualConv轻量化双卷积设计(附改进代码)

DualConv是一种创新的卷积网络结构,旨在构建轻量级的深度神经网络。它通过结合3×3和1×1的卷积核处理相同的输入特征映射通道,优化了信息处理和特征提取。DualConv利用组卷积技术高效排列卷积滤波器,大大降低了计算成本和参数数量。

m0_74890428的博客 4698

MYSQL-初级-事务篇

事务是一组操作集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起想系统提交或撤销请求,这么操作要么全部执行成功,要么全部失效。

记录大学四年代码 1195

第10.6章 FAST-LIO源码解读(三): iekf模块大揭秘,从公式到代码一看就懂

FAST-LIO中的IEKF模块解析:本文深入剖析了FAST-LIO定位框架中迭代扩展卡尔曼滤波(IEKF)的实现原理。文章首先介绍IEKF作为"激光+IMU融合"计算器的核心作用,解释其通过IMU高频预测和激光点云校正实现厘米级定位的原理。随后详细拆解了代码实现中的关键设计:包括状态量定义(位置、姿态、速度等)、过程噪声建模、状态转移方程推导,以及SO3与欧拉角转换等核心算法。特别强调了IEKF通过迭代优化解决非线性问题的优势,使其在无人机等快速运动场景中保持稳定定位。

行知SLAM 231

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.5 RTC设备编写与实现

4. Linux kernel RTC子系统goldfish_rtc driver分析。电脑,会需要时间,还比如 我们的手机、平板,都需要时间;驱动基本就是应用层需要什么数据你给什么数据就行,基本必须实现的就是。3.2 Linux kernel RTC 设备描述符讲解。中看到他的具体实现,也可以根据他的寄存器描述直接在。5. 将驱动添加进kernel和测试RTC驱动。系统来说,时间是一个非常重要的功能;之类的函数接口,接下来我们就开始讲解如何写。,所以我们直接移植设备树即可。,他的寄存器很简单,你可以从。

DSMGUOGUO的博客 568

《MySQL》事务

事务的理解,操作,以及隔离级别

qq_56166591的博客 987

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

随着新零售和智能仓储的快速发展,商品识别技术成为计算机视觉领域的重要研究方向。本文详细介绍了基于YOLO系列算法的商品识别系统的完整实现方案,涵盖算法原理、数据集构建、模型训练、系统集成和可视化界面开发。通过对比YOLOv5到YOLOv8各版本性能差异,我们构建了一个高效、准确且用户友好的商品识别系统,并提供完整的代码实现。

YOLO 284

mysql面试——事务隔离级别以及事务隔离实现的锁机制

MySQL 的事务隔离级别和锁机制是确保数据一致性和并发性能的关键。理解不同隔离级别的特点及其背后的锁机制,有助于设计高效、可靠的数据库应用。通过合理选择隔离级别、优化锁的使用以及监控和解决锁竞争问题,可以显著提升数据库系统的性能和稳定性。

2401_86405063的博客 1067

STM32外部中断EXTI原理与飞控实时应用实战

外部中断(EXTI)是嵌入式系统中实现事件驱动和实时响应的核心机制,其本质是将外部电平变化转化为可调度的CPU中断事件。基于ARM Cortex-M NVIC架构,EXTI通过GPIO-EXTI-NVIC三级硬件通路实现低延迟信号捕获,具备边沿触发、优先级管理与挂起控制等关键能力。在四轴飞控、工业传感器、人机交互等对毫秒级响应有强需求的场景中,EXTI显著优于轮询方式,兼顾实时性与CPU资源效率。实际开发需严格遵循SYSCFG映射→EXTI配置→NVIC使能的时序逻辑,并规避常见陷阱如中断号误配、伪触发、低

weixin_36382073的博客 65

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MySQL事务隔离级别与锁机制

通常我们的数据库操作中都会并发执行多个事务,当多个事务对数据进行增删改查操作时,可能会出现我们常说的脏读、幻读、不可重复读等问题。为了解决这些因为数据库多事务并行所导致的问题,MySQL设计了事务隔离机制、MVCC( 多版本并发控制)隔离机制,接下来让我们深入理解一下这些机制以及执行原理。

m0_61172147的博客 934

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

5、Mysql事务隔离级别与锁机制

我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。锁是计算机协调多个进程或线程并发访问某一资源的机制。

sproutBoy的博客 1182

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ssm框架搭建

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

Mysql中的锁机制和事务隔离级别

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。

定格空间 1393

深入理解Mysql事务隔离级别与锁机制

事务(Transaction)是指一组操作的集合,这些操作要么全部成功执行,要么全部不执行,是数据库操作中的一个基本单位,用于保证数据的一致性和完整性。原子性(Atomicity)事务中的所有操作是一个整体,要么全部执行成功,要么全部失败回滚,不能只执行其中的一部分。undolog可以恢复事务开始前的数据(事务回滚)。一致性(Consistency)事务执行前和执行后,数据库都必须处于一致的状态。例如,转账操作中,一个账户减少的钱必须等于另一个账户增加的钱。隔离性(Isolation)

weixin_58611042的博客 1006

MySQL之事务隔离级别与锁机制浅析

文章摘要: MySQL通过锁机制、事务机制和日志机制保证数据ACID特性。锁机制分为乐观锁和悲观锁,按粒度有表锁、行锁等,其中行锁支持间隙锁和临键锁解决幻读问题。事务机制通过隔离级别(RU/RC/RR/SERIALIZABLE)处理并发问题,MVCC机制结合undo log实现读写不冲突。InnoDB特有的事务特性由undo log(原子性)、锁/MVCC(隔离性)和redo log(持久性)共同保障,最终实现数据一致性。不同隔离级别在并发控制上各有侧重,RC解决脏读,RR通过间隙锁解决大部分幻读,SERI

qq_44784918的博客 1462

性能调优——18 深入理解MySQL事务隔离级别与锁机制

MySQL 事务及ACID特性讲解、MySQL 事务隔离级别详解、MySQL 锁机制详解、MySQL 锁优化建议。

念头通达 1176

MySQL事务隔离级别与锁机制详解

理解核心机制:MVCC处理读-写冲突,锁机制处理写-写冲突选择合适的隔离级别:默认"可重复读"适合大多数场景注意锁的粒度:良好的索引设计可以显著减少锁冲突预防死锁:保持事务短小,以固定顺序访问资源持续监控:定期检查锁等待和长事务问题深入理解这些机制,可以帮助你设计出既保证数据一致性又具备高并发性能的数据库应用。

weixin_46322148的博客 706

深入理解 MySQL 事务隔离级别与锁机制

在数据库应用中,事务隔离级别与锁机制是确保数据完整性和并发处理能力的关键要素。它们直接影响着数据的一致性、并发性以及系统的整体性能。今天,我们就来深入探讨 MySQL 中的事务隔离级别与锁机制,了解它们的工作原理、应用场景以及如何优化。

SOS5418818845的博客 997

MySQL锁机制与事务隔离级别

什么是事务? 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。   原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。   一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。   隔离性(Isolation):数据...

f5465245的博客 439

【MySQL篇】深入理解Mysql事务隔离级别与锁机制

1. MySQL事务及ACID特性详解 2. MySQL事务隔离级别详解 3. MySQL锁机制详解 4. MySQL锁优化建议

qq_44781222的博客 1320
上一篇: SQL索引优化实战之分页查询与关联查询
下一篇: mysql索引简介及索引底层数据结构为何采用B+Tree
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值