Mysql中的锁以及MVCC

mysql机制mvcc 一、mysql 常见 在多节点部署或者多线程执行时,同一个时间可能有多个线程更新相同数据,产生冲突,这就是并发问题。这样的情况下会出现以下问题: 更新丢失:一个事务更新数据后,被另一个更新数据的事务覆盖。 脏读:一个事务读取另一个事物为提交的数据,即为脏读。 其次还有幻读,针对并发引入并发控制机制,即加。加的目的是在同一个时间只有一个事务在更新数据,通过独占数据的修改权。 1、乐观: 使用版本标识来确定读到的数据与提交时的数据是否一致。在每一行记录的后面增加两个隐藏列,记录创建版本号删除版本号, 阅读详情

Mysql中的锁以及MVCC

课程安排

  • MySQL中的锁应用
  • MySQL中的MVCC应用

MySQL中锁的应用?

  • 事务的隔离在底层是如何实现的?
1. 读写锁
2. 一致性快照读(MVCC-多版本并发控制)
  • mysql中的锁是如何分类的?
1. 从性能上讲可以分为乐观锁和悲观锁。
2. 从操作类型上讲可以读锁(共享锁)和写锁(排它锁)
3. 从数据操作粒度上来讲可以分为全局锁、表锁、行锁、间隙锁(between 100 and 200)、...
  • 如何理解MySQL中的MVCC(Multi version concurrent control)?
MVCC称之为多版本并发控制,它是通过读取历史版本的数据,来降低并发事务的冲突(尽量减少阻塞),
进而提高事务的并发效率。
  • 如何理解MySQL中的全局锁?
全局锁是要关闭所有打开的表。在MySQL可以使用全局读锁锁定所有表,通常应用于逻辑备份,我们在执行
数据库备份时,不允许其它事务对数据库进行更新了,因为这样可能会导致备份的数据与库中实际的数据
不一致。
  • MySQL中的全局锁是如何应用的?
1. 加全局读锁 (flush tables with read lock): 只能读库中所有表的数据,但是不能写(insert,update,delete)。
2. 解锁 unlock tables
  • 如何理解MySQL中的表级锁?
表锁一般是针对与某张表进行锁定,包括表锁(表读锁和表写锁)和元数据锁(Metadata Lock-MDL)。
  • 如何对MySQL中的表添加读锁(共享锁)、写锁(排它锁)?
1. 读锁(lock table regions read):所有线程可以读,当先线程写会出错,其它线程写会阻塞。
2. 写锁(lock table regions write):当前线程可以读写,其它线程读写要阻塞。
  • 如何理解MySQL中的行锁?
行锁就是针对表中的某一行进行锁定。
  • 如何对MySQL表中的行添加行锁(InnoDB默认select操作不加锁)
1. 共享锁 (select * from regions where id=13 lock in share mode),又称为S锁,
   允许当前事务读取一行,阻止其它事务获取相同数据集的排它锁。
   
2. 排它锁 (select * from regions where id=13 for update),又称为X锁。
   允许当前事务更新数据,阻止其它事务获取相同数据集的共享锁和排它锁。

MVCC(多版本并发控制)

  • MVCC 是什么?
MVCC(Multi Version Concurrent Control)多版本并发控制,它可以通过历史版本
保证读数据的一致性,但是这样方式相对于添加排它锁,并发性能要好.
  • 你是否还记得事务的四个特性,底层是如何保证这些特性成功的?
1. 原子性(通过undolog实现-执行回滚)
2. 隔离性(通过锁,MVCC-多版本并发控制)
3. 一致性(通过undolog,redolog,binlog)
4. 持久性(通过redolog日志实现)

  • MVCC的底层逻辑是如何实现的呢?
MVCC的实现原理主要依赖于记录中的undolog(回滚日志),ReadView(读视图-快照读),三个隐藏字段来实现的.
  • MVCC中的三个隐藏字段指的是哪些?(了解)
1. DB_TRX_ID:记录创建这条记录或者最后一次修改该记录的事务id
2. DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undolog实现数据的回滚.
3. DB_ROW_ID:隐藏的主键,如果数据表没有主键,也没有非空且唯一的字段,那么innodb会自动生成一个row_id。
  • 如何理解MVCC中的版本链?

当我们开启了一个事务,并且这个是要对数据进行更新,此时会产生一条undo日志,多个事务同时操作 这一条记录时候,那就会产生多个版本的undo日志,这些日志会通过回滚指针(DB_ROLL_PTR)构建一个 链表,这个链表就称之为版本链。

 

  • 如何理解快照读?

快照读也称之为普通读,读取的是记录中的可见版本数据,这种读加锁,就是普通的select。

  • 如何理解当前读?

当前读也称之为锁定读(Locking Read),读取的记录是数据的最新版本,这种读需要在读之前 先获取对应记录的锁。

select * from xxx where id=1 lock in share mode;
select * from xxx where id=1 for update;
  • 什么是ReadView?

ReadView提供了某一时刻事务系统的一个快照,主要用来做“可见性”判断。这个ReadView中也保存了 对本事务不可见的一些其它活跃事务的id。

  • ReadView应用场景?
对于Read Committed和Repeatable Read的隔离级别,都要读取已经提交的事务数据,也就
是说如果版本链中的事务没有提交,该版本的记录是不能被读取的,那哪个版本的事务是可以读取
的,此时就引入了ReadView. MySQL数据库隔离级别中的Read Committed和Repeatable Read
底层都是通过这个MVCC实现的。

  • ReadView中包含什么?

MySQL5.7版本中的ReadView中包含了如下几个属性:

1. m_ids: 截止到当前事务id之前,所有活跃的事务id(还没有commit的事务)。例如m_ids[1,2,3,4]
2. min_trx_id: 记录活跃事务id中(m_ids)的最小值。例如 1;
3. max_trx_id: 保存当前事务结束后应分配的下一个事务id值。例如 5;
4. creator_trx_id: 保存创建ReadView的当前事务id。例如 4;

 

ReadView 会根据图中的四个属性,再集合undo日志版本链,实现MVCC机制,决定一个事务可以读取到的数据版本。

  • ReadView 可见性判断的规则是怎样?
1. 如果db_trx_id与Readview中的creator_trx_id是否相等,则说明当前事务在访问自己的操作数据,此时可以访问。
2. 如果db_trx_id小于ReadView中的min_trx_id值,表明生成的该版本的事务在当前事务生成readview之前已经提交,所以可以直接读取.
3. 如果被访问版本的db_trx_id大于ReadView中的max_trx_id值,表明该版本的事务在当前事务生成ReadView后才开启的,所以该版本不可以被当前事务访问. 
4. 如果访问的版本的db_trx_id属性值在min_trx_id和max_trx_id之间,就需要判断一下db_trx_id的值是不是在m_ids列表中,如果在,说明创建ReadView时,生成的该版本的事务还是活跃的,该版本不可以访问,如果不存在,则说明创建ReadView时,生成该版本的事务已经提交则可以读取.

  • 事务隔离(RC-Read Committed,RR-Repeatable Read)何时创建ReadView视图?

1.Read Committed隔离级别每次select都会创建一个新的ReadView.(可以读取已提交的数据)

2.Repeatable Read隔离级别是第一次select时创建一个ReadView.(每次只能读取当前事务的数据)

  • 案例分析(读已提交这个隔离级别是如何通过MVCC去是实现)

例如:现有一个Regions的undo日志链,事务的版本号(DB_TRX_ID)为10,主键region_id值为1,region_name值为A

第一步:假设现在有两个并发事务,分别为事务A和事务B:

事务A(DB_TRX_ID=20): select * from regions where region_id=1;
事务B(DB_TRX_ID=30): update regions set region_name='AA' where region_id=1;

事务A的ReadView为:

m_ids=[20,30]
min_trx_id=20
max_trx_id=31
creator_trx_id=20

事务B的ReadView为:

m_ids=[20,30]
min_trx_id=20
max_trx_id=31
creator_trx_id=30

第二步:事务A开启后,通过版本链第一读取数据,版本链中的DB_TRX_ID为10,这个值小于事务A的 DB_TRX_ID=20的值,说明DB_TRX_ID=10这条记录是事务A开启之前就已经写的,并且提交了事务, 所以这条记录事务A是可以读取到的。

第三步:事务B(DB_TRX_ID=30)修改数据,将region_name修改为'AA',这个修改后也要写入undo日志,

第四步:事务A(DB_TRX_ID=20)再次读取region_id为1的记录,此时在undo版本链中,最新版本的 事务id值为30,这个值在事务A的ReadView中的m_ids数组中,表示这个事务是活跃事务,事务A是读取不到的。 此时事务A会沿着undo日志的版本链继续向前查找,这样就会找到DB_TRX_ID值为10的记录,这条记录的事务id 值小于事务A的ReadView中的min_trx_id值,这个事务应该为一个已提交的事务,所以事务A可以读取这条记录。 此时拿到的region_name的值为'A'

第五步:现在事务B提交,此时系统中的活跃事务就只有事务A了,事务A在第三次读取时,可以读取到的内容就 有两种可能了,假如事务的隔离级别为RC级别,读取到的数据就是'AA'。假如事务的隔离级别RR,此时读取到的 数据就是'A';

总结(Summary)

RK3588零拷贝视频流水线实战:用GStreamer+Mpp实现8K硬解与DRM显示 本文深入探讨了在RK3588平台上构建零拷贝视频流水线的工程实践。通过结合GStreamer与MPP,实现了从8K视频硬解到DRM显示的全流程硬件加速,有效解决了高分辨率视频处理中的DDR带宽瓶颈问题。文章详细解析了dma-buf数据流机制、管道构建与性能优化策略,为多路视频并发处理提供了高效的系统架构解决方案。 阅读详情

相关推荐

【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用

【图像超分】论文精读:Image Super-Resolution Using Deep Convolutional Networks(SRCNN)请配合上述论文精读文章使用,效果更佳!图像超分辨率SRCNNFSRCNN复现代码,除基本的网络实现外,还有特征图可视化,PSNR曲线图可视化,测试自己的图像数据等不想理解原理,希望直接跑通然后应用到自己的图像数据的同学,请直接下载上面的代码,有训练好的模型,直接用即可。具体使用方式见代码中的README!有问题来本文评论区留言!准备数据集,以及数据预处理。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

MySQL机制与MVCC详解】

1、悲观:悲观在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据住,直到操作完成后才会释放;上期间其他人不能修改数据2、乐观:乐观在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观不会上,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作undo日志版本链与read view机制详解。

weixin_42070243的博客 797

多文档界面(MDI)系统框架-C#源码完整版

多文档界面(MDI)系统框架,C#完整实例,对于如何运用MDI搭建一个系统框架,具有绝对的参考学习价值。内含两份详细源代码。其一采用观察者模式。

MySQL机制与MVCC深度解析

多版本并发控制(Multi-Version Concurrency Control)是InnoDB实现高并发的重要机制,通过在同一时刻保存数据多个版本,实现:读操作不阻塞写操作写操作不阻塞读操作解决幻读问题(在RR隔离级别)

2301_79730192的博客 1705

一文详解MySQL各种MVCC的使用场景及原理

一文详解MySQL各种MVCC的使用场景及原理

loseyourself94的博客 1555

MySQL 机制与 MVCC 底层原理

仅在 RR 隔离级别生效(MySQL 默认隔离级别),用于解决幻读问题;定 “索引值之间的间隙”(开区间),不定边界值,阻止其他事务在间隙内插入数据。行 + 间隙的组合,定范围为 “左闭右闭” 区间(间隙为开区间),是 InnoDB RR 级别下默认的策略。读多写少:乐观 + RC 级别 + 索引优化;写多读少:悲观(行) + RR 级别 + 间隙控制;高并发核心:索引精细化设计 + 事务缩短 + 粒度最小化;

2403_85207115的博客 967

MySQL数据库—— + MVCC

MySQL定粒度最大的一种(全局除外),对当前操作的整张表加,实现简单,加的开销小,加快,不会出现死。不过,触发冲突的概率最高,高并发下效率极低。表级存储引擎无关,MyISAM InnoDB 引擎都支持表级

乌昂先生的博客 894

MYSQL中的MVCC机制

在RR隔离界级别下,为了防止出现不可重复读幻读情况,在遍历聚集索引的时候,为了防止其他事物操作数据(不可重复读)间隙被插入问题(幻读),导致数据不一致,因此会在所有扫描到的索引记录间隙加上。这个read view是有,当前未提交的事物trx_id数组(数组里id最小的为min_id),已创建的最大的事物trx_id(trx_id>Y,说明在事物之后提交的,不可读(如果为自己当前事物的可读)。共享共享之间不阻塞,共享排他之间阻塞,排他排他之间阻塞。未提交区间[*,*];

m0_70448456的博客 1192

MVCCMySQL中常见的

MVCC是一种用于数据库管理系统中实现并发控制的技术,它允许在同一时间对数据进行多个事务的读写操作,同时保证数据的一致性隔离性。假设没有意向,当一个事务想要对整个表加表级别的排他时,数据库需要逐行检查表中的每一行数据是否已经被其他事务加了行级。当一个事务执行写操作时,它会创建一个新的数据行版本,并将其版本号设置为当前系统的最大版本号加 1。同时,旧的数据行版本仍然保留,以便其他事务可以读取。当一个事务执行读操作时,它会根据自身的事务版本号数据行的版本号来判断应该读取哪个版本的数据。

JK01WYX的博客 1231

MySQL中的MVCC

MySQL的InnoDB存储引擎中,是用于管理并发访问的一种机制。MVCC的核心思想是通过维护数据的多个版本来实现并发控制。:避免了脏读不可重复读,但还存在幻读的可能性(即在一个事务的两次查询中数据笔数不一致)。在MySQL的InnoDB存储引擎中,可重复读是默认的隔离级别。在MySQL中,可以通过两种方式实现可串行化:基于的实现基于MVCC的实现。:在可重复读隔离级别下,同一个事务内的查询都是事务开始时刻一致的。:避免了脏读,但可能出现不可重复读,即在一个事务的两次查询中,数据可能不一致。

cuishujian_2003的博客 1305

MySQL及其MVCC

MySQL机制摘要一、乐观与悲观1.1 乐观1.2 悲观二、MySQL分类2.1 表 摘要   在当下互联网技术的发展状态下,数据的高并发是随处可见,那么数据库如何解决高并发所带来的问题呢。便是计算机用于解决多进程或多线程并发服务中保持数据一致性的关键。本文主要介绍MySQL中的。 一、乐观与悲观   乐观与悲观并不是实际的,它是对的一种抽象。本文要讲解的MySQL中...

HelloWorld16 512

深入理解 MySQL 中的MVCC机制

MySQL中的MVCC是确保数据完整性并发性的关键机制。深入理解它们的工作原理使用方法,有助于设计维护高性能的数据库系统。选择合适的隔离级别、避免过度使用、监控调优是确保数据库系统安全可靠的关键步骤。通过不断学习实践,我们可以更好地掌握MySQL中的MVCC,提高数据库系统的性能可靠性。😊🙏Java面试技巧Java面试八股文 - 掌握面试必备知识(目录篇)Java学习路线2023年完整版Java学习路线图AIGC人工智能。

学IT,找陈寒 9586

mysql mvcc 关系

多版本并发控制(MVCC)是一种用于数据库并发控制的机制,它可以在保证数据一致性的同时,提高数据库的并发性能。下面结合 MVCC 机制,详细阐述常见的四种事务隔离级别(读未提交、读已提交、可重复读、串行化)与各种(共享、排他、记录、间隙、临键)之间的关系。

WangYuChenCSDN的博客 1152

MySQL中的、隔离级别、MVCC

MySQL中的、隔离级别、MVCC的理解

m0_52138519的博客 2561

mysql mvcc_MySQL MVCC 机制

MVCC(Multiversion Concurrency Control)1、MVCC概念多版本控制(Multiversion Concurrency Control): 指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,InnoDB通过un...

weixin_33481022的博客 1288

MySQL(05) mysqlMVCC、Innodb行

本文系统介绍了MySQL事务隔离机制与的实现原理。主要内容包括:1. 并发事务的三种访问情况(读-读、写-写、读-写)及其对应的机制;2. 解决并发问题的两种方案(MVCC),重点分析了MVCC的实现原理ReadView机制;3. 共享与排他的特性及互斥规则;4. MySQL 8.0新增的NOWAIT/SKIP LOCKED语法特性;5. 的粒度分类(表、行、页)以及索引命中与否对级别的影响。文章深入浅出地阐述了MySQL如何通过机制MVCC实现事务隔离,确保数据一致性的同时提

m0_56799642的博客 1077

一文带你聊聊MYSQLMVCC

本文通过LBCC(单版本控制-)的概念切入,分析了全局、表、行、页、死、两阶段等概念,还分析了MVCC(多版本并发控制),比较了两者的区别以及适用场景。

Linn的博客 1479

Mysql系列(四)彻底理解MVCC+行+表+间隙

文章目录一. 什么是MVCC二.什么是行、表、间隙三. MVCC与各种的关系四. MVCC的实现原理4.1 多版本4.2 undo log4.2 readview 一. 什么是MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制。不使用,主要是用来提高数据库的并发性能;算是一种概念,不同的数据库有不同的实现方式,本文主要介绍mysql的innodb引擎中的实现方式。 在mysql的innodb中,前面我们有篇文章《Mysql系列(二)Mysql

雨剑的博客 3925

mysql】关于innodb中MVCC的一些理解

一、MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行的事务引擎,不再单纯的使用行来进行数据库的并发控制,取而代之的是把数据库的行与行的多个版本结合起来,只需要很小的开销,就可以实现非定读,从而大大提高数据库系统的并发性能 读:也叫共享、S,若事务T对数据对象A加上S,则事务T可以读A但不能修改A,其他事务只能再对A加S,而不能加X,直到T释放A上的S 。这保证了其他事务可以读A,但在T释放A上的S

381

MySQLMVCC与其它的区别

多版本并发控制(MVCC),是一种用来解决读-写冲突的无并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。 这样在读操作不用阻塞写操作,写操作不用阻塞读操作的同时,避免了脏读不可重复读。不仅是MySQL,包括Oracle、PostgreSQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同。 MVCC与乐观悲观: 悲观大多数情况下依靠数据库机制实现,以保证操作最大程度的独占性。但开销很大,在SELE

MieMieFly的专栏 1238

MYSQL事务隔离

MySQL主要有4种类型的事务隔离级别,分别为: read uncommitted 【读取未提交内容】 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 read committed 【读取提交内容】 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的...

weixin_30648587的博客 173
上一篇: 数据库查询练习
下一篇: MySQL中的索引应用
敲敲木鱼咚咚
博客等级 码龄8年 2粉丝 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值