作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第七篇,总结了MySQL是如何解决幻读的。
当数据库的隔离级别为Repeatable Read或Serializable时,我们来看这样的两个并发事务(场景一):
接下来,就跟聊聊上面两个事务执行 SQL 语句的过程中,加了什么锁,从而导致死锁的。
其中Next key锁是Gap锁和Record锁的结合,他锁定的是一个范围,并且锁定记录本身。
MySQL 作为使用范围最广的开源关系型数据库,是每个后端开发人员都绕不开的一道坎。我在上一篇文章中也写了关于 MySQL 中的 MVCC 的细节及各个隔离级别如何使用 MVCC,有兴趣的可以查看。
在上篇文章中,我们就提到过 元数据锁 和 间隙锁 这两个名词,不知道有没有吊起大家的胃口。这俩货又是干嘛的呢?别急,我们一个一个来看。
疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发现了死锁现象:
疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发生了死锁现象:
为了防止在事务中出现表结构操作,导致事务无法保证前后一致性问题,mysql增加了 (meta data lock,MDL) 锁.
MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,确保查询结果的一致性和并发安全性。
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说mysql的几种锁_初中常见七种沉淀,希望能够帮助大家进步!!!
MVCC 和间隙锁是两种完全不同的机制,但它们的目的都是相同的,都是用来保证数据库并发访问的,我们先来看二者的定义。
在之前的一次开发需求中使用了 for update 实现悲观锁,最后导致出现了很多的 MySQL 死锁报警,现记录下死锁产生的原因。
InnoDB实现标准的行级锁定,其中有两种类型的锁: 共享(S)锁和排他(X)锁。
最近在看 小林coding 的文章,看到一篇《字节面试:加了什么锁,导致死锁的?》,自己也跟着做了做,题目如下图:
MySQL数据库提供了四种默认的隔离级别,读未提交(read-uncommitted)、读已提交(或不可重复读)(read-committed)、可重复读(repeatable-read)、串行化(serializable)。
在前一篇文章我讲了下 MySQL 的全局锁、表记锁和行级别锁,其中行级锁只提了概念,并没有具体说。
官网的解释大概意思就是:next-key 锁是索引记录上的记录锁和索引记录之前的间隙上的间隙锁的组合。
这时候可以用select * from information_schema.innodb_locks;查看锁情况:
之前的一篇文章 《深入理解MySQL的MVCC原理》中总结了一下MySQL中的MVCC,它主要利用隐藏字段、版本链、ReadView来实现,可以用来更好地解决多个事务的并发【读+写】问题,但是如果在多个事务并发【写+写】的情况下,就必须要用到锁了,一般情况下,数据库的锁都是在有数据库操作的过程中自动添加的。
要在高并发的场景下,保证基于InnoDB的应用程序的可靠性、性能,理解InnoDB的锁机制是必不可少的。
这时候可以用 select*frominformation_schema.innodb_locks;查看锁情况:
InnoDB与MyISAM有两处不同: 1)InnoDB支持事务; 2)默认采用行级锁(也可以支持表级锁)
间隙锁的作用 保证某个间隙内的数据在锁定情况下不会发生任何变化。比如mysql默认隔离级别下的可重复读(RR)。
学习Mysql, 总会有一座绕不过去的大山, 那就是锁。理论上,锁的花样再多,也超不出操作系统课上讲的那些范畴,但是Mysql锁让我翻车了。
但事实上,Innodb 引擎实现了行级锁,与只支持表级锁的 MyISAM 相比,这显然能够有效减少锁冲突,这也是 Innodb 最终能够战胜 MyISAM 成为 MySQL 默认存储引擎的一个重要原因。 因此我们在使用中,最为频繁接触到就是行级锁,用好行级锁,减少锁冲突,将有效提升 MySQL 的执行性能,本文我们就来详细介绍一下 Innodb 中的各种行级锁。
但是,实际上「插入意向锁」不是意向锁,而是特殊的间隙锁,属于行级锁,注意是「特殊」的间隙锁,并不是我们常说的间隙锁。
锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制。MySQL中为了保证数据访问的一致性与有效性等功能,实现了锁机制,MySQL中的锁是在服务器层或者存储引擎层实现的。
好了,锁相关内容的最后一篇文章了。其实最核心的内容,表锁、行锁、读锁、写锁、间隙锁这些重要的内容我们都已经学习过了,特别是间隙锁,是不是感觉非常复杂。放心,今天的内容就比较轻松了。
在上一篇文章《锁的类型以及加锁原理》主要总结了 MySQL 锁的类型和模式以及基本的加锁原理,今天我们就从原理走向实战,分析常见 SQL 语句的加锁场景。了解了这几种场景,相信小伙伴们也能举一反三,灵活地分析真实开发过程中遇到的加锁问题。
客户端发往MySQL的一条条SQL语句,实际上都可以理解成一个个单独的事务(一条sql语句默认就是一个事务)。而事务是基于数据库连接的,每个数据库连接在MySQL中,又会用一条工作线程来维护,也意味着一个事务的执行,本质上就是一条工作线程在执行,当出现多个事务同时执行时,这种情况则被称之为并发事务,所谓的并发事务也就是指多条线程并发执行。
上篇文章主要聊了全局锁和表锁,并详细分析MDL锁的作用以及可能带来的问题。今天我们主要来聊一聊Innodb存储引擎的行锁。MySQL的行锁是在引擎层由引擎自己实现的,并不是所有的引擎都支持行锁,MyISAM 引擎就不支持行锁。行锁,顾名思义就是针对数据表中的行记录的锁。比如事物A更新了一行,而事物B也要更新同一行,就必须等待事物A的操作完成后才能进行。下面我们就介绍下行锁的种类,针对不同的锁进行操作演示。
上一篇文章中,我们已经知道innodb中的间隙锁是对普通索引记录的间隙做的一个锁定动作,这篇文章我们分析下间隙锁在唯一索引中的应用。
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章 一文详解MySQL的锁机制
本文介绍比较重要的一些锁,基于这些锁,对于理解MySQL的其他特性是大有帮助。部分锁例如AUT0-INC Locks有兴趣请自己发掘。
下面画了一个图,图中是MYSQL 中提供的锁的类型从图中可以看到 IS意向锁可以和除X锁的其他锁类型共存, X 锁则是和任何锁都是互斥的,和他本身也是一样,AI 锁 只和意向锁共存。
MySQL的并发控制是在数据安全性和并发处理能力之间的权衡,通过不同的锁策略来决定对系统开销和性能的影响。
三分钟了解Mysql的表级锁 一分钟深入Mysql的意向锁 mysql锁相关讲解及其应用——《深究mysql锁》
1、当我们用范围条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做间隙。
表锁是指锁定时锁定整个表,下一个事务访问该表时,必须等到上一个事务解除锁定后再访问表
上一篇文章介绍了数据库中锁的起源,今天将介绍数据库中常用的锁。还是以MySQL为例,MySQL中有表锁、行锁、共享锁、互斥锁、意向锁、间隙锁、记录锁、Next-Key锁、插入意向锁、AUTO-INC锁、隐式锁。看完本篇文章,再多的锁都难不倒你。
在上篇文章,我们聊了「MySQL 啥时候会用表锁,啥时候用行锁」这个问题。在文章中,我们还留了一个问题,即:如果查询或更新时的数据特别多,是否从行锁会升级为表锁?此外,还有朋友留言说到:不同的隔离级别可能会用不同的锁,可以结合隔离级别来聊聊。
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-shared-exclusive-locks
①表锁 :表共享读锁(read lock) / 表独享写锁(write lock)
领取专属 10元无门槛券
手把手带您无忧上云