【MySQL】锁

MySQL 事务在从数据库中取数据时,会将该数据的版本也取出来(v1),当事务对数据变动完毕想要将其更新到表中时,会将之前取出的版本v1与数据中最新的版本v2相对比,如果v1=v2,那么说明在数据变动期间,没有其他事务对数据进行修改,此时,就允许事务对表中的数据进行修改,并且修改时version会加1,以此来表明数据已被变动。也就是说,无论是行级或是表级,如果对某数据上了共享 ,允许其他事务也加共享,共享和共享不互斥),但是不能写,也就是。间隙指的是两个记录之间逻辑上尚未填入数据的部分,是一个左开右开空间。 阅读详情

锁是因为多个线程争抢资源而出现的机制,锁的出现可以保证在并发访问数据时数据的一致性和有效性,其重要性不言而喻
MySQL中的锁按照粒度分为全局锁,表级锁和行级锁,MySQL的锁机制最显著的特点是不同的存储引擎支持不同的锁机制

1.全局锁

全局锁就是对整个数据库实例进行加锁,加锁后实例处于只读状态只能够进行读取操作,其它的操作都将会被阻塞

加锁:
  flush tables with read lock;
解锁:
  unlock tables;

2.表级锁

表级锁就是锁住整张数据表,表级锁主要分为三类:表锁,元数据锁和意向锁

2.1 表锁

表锁可以分为表共享读锁(read lock)和表独占写锁(write lock),通常我们简称为读锁和写锁

加锁:
  lock tables 表名......read/write;
解锁:
  unlock tables;

读锁的特点是只允许读取数据的操作,其它操作会被阻塞
写锁是只允许当前客户端进行读取和修改操作,其它客户端的操作会处于阻塞状态

2.2 元数据锁

元数据锁的加锁过程是由系统自动控制的,不需要我们自己手动进行加锁,元数据锁会在访问数据表的时候自动加上,元数据可以理解为表结构
元数据锁的作用是当有事务未提交的时候防止事务对表结构进行修改,避免DML和DDL语句冲突
元数据锁同样也有读锁和写锁,当对一张表进行增删改查的操作的时候会加读锁,对表结构进行修改的时候加写锁

2.3 意向锁

在执行DML语句的时候会加表锁和行锁,为了避免这两个锁冲突所以引入了意向锁
表锁在加锁之前首先要对数据的每一行进行检查,确定数据没有加行锁之后再进行加锁,意向锁则可以减少表锁的检查
意向锁分意向共享锁(IS)和意向排他锁(IX)

IS和表锁的读锁兼容,和写锁排斥
IX则是和表锁的读锁写锁都排斥,但意向锁之间是兼容的

当表锁和意向锁排斥,说明此时表锁就不能进行加锁
意向锁是存储引擎自动维护的,不需要手动添加

3.行级锁

行级锁每次加锁锁住的是数据表的一行数据,发生锁冲突的概率最低,用于InnoDB引擎
由于InnoDB的数据是基于索引组织的,所以行锁是对索引上的索引项进行加锁
行级锁分为三种:行锁,间隙锁和临建锁

3.1 行锁

锁定单个行记录的锁,在MySQL中锁定粒度最细,但因为粒度小所以开销也大,而且容易死锁,InnoDB实现了两种类型的行锁:共享锁(S)和排他锁(X)

  • 共享锁:多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改
  • 排他锁:不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,那么其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,获取排他锁的事务可以对数据进行读取和修改

由此可以得出的结论是共享锁和共享锁兼容,排他锁和其它锁都是互斥的

一般执行insert,update,delete语句的时候InnoDB引擎会自动加上排他锁
如果在select语句后面手动加上lock in share mode 就是加共享锁,select语句后面加for update就是加排他锁

由于InnoDB的行锁是对索引进行加锁,如果不通过索引来检索数据的话,InnoDB将会对数据表中所有的数据进行加锁,此时行锁就会升级为表锁

3.2 间隙锁和临建锁

间隙锁:锁住索引记录间隙,防止其他事务在这个间隙进行insert操作产生幻读,间隙锁之间可以共存
临建锁:行锁和间隙锁的组合
MySQL默认事务隔离级别为可重复读(repeatable read),InnoDB在这种隔离级别下运行会使用临建锁来防止幻读
之所以将二者放在一起,是因为InnoDB引擎中在某些情况下二者能进行转换

  • 使用唯一索引进行等值查询(类似where id=3这种),给不存在的记录加锁时为间隙锁
  • 使用普通索引进行等值查询,如果遍历到最后一个值不满足查询要求,临建锁退化为间隙锁
  • 使用唯一索引进行范围查询,加临建锁

4.死锁

在MyISAM中不会产生死锁,但是在InnoDB中则会有发生死锁的可能,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待,而在InnoDB中,锁是逐步获得的

由于在InnoDB中行级锁是锁索引,而索引分为主键索引和非主键索引两种,所以如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引,当这两条语句同时执行的时候就会发生死锁

想要避免死锁发生,常见的方式有下面几种:

  1. 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表
  2. 在同一个事务中,尽可能做到一次锁定所需要的所有资源
  3. 尝试将行级锁升级为表级锁来减少死锁发生的概率

关于MySQL锁的内容到这结束,完

MySQL】如何理解MySQL(图文并茂,一网打尽) 这里博主整理我们常见的MySQL的概念,还介绍了面试中 常问的关于乐观、悲观的 一些特点。后续还有更多内容与大家分享~ 阅读详情

相关推荐

MySql的详解(干货请备好咖啡)

数据库中,除传统的计算资源(如 CPU 、 RAM 、 I/O 等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对进行控制 ,因此产生了数据库数据库是为了解决事务的隔离性问题,为了让事务之间相互不影响。如果你想一个人静一静,不被别人打扰,那么请在你的房门上加上一把

灰灰的博客 1258

MySQL(深度解析)

本文介绍了InnoDB存储引擎中的机制,主要包括以下内容: 的类型: 共享(S Lock)和排他(X Lock)的区别及兼容性。 意向(IS Lock和IX Lock)的作用及表级意向与行级的兼容性。 的算法: Record Lock:定单个行记录。 Gap Lock:定索引记录之间的范围。 Next-Key Lock:结合Gap Lock和Record Lock,解决RR隔离级别下的不可重复读和幻读问题。 读取: 一致性非定读(MVCC机制)在READ COMMITTED和REPE

427

MySQL详解

全局数据库中所有的表。表级:每次曹住整张表。行级:每次操作住对应的行数据。表级,每次住的是整张表。定粒度较大,发生冲突的概率最高,并发度最低。引用在MyIsam,innodb等存储引擎中。对于表级,主要分为一下三类:1.表2.元数据(meta data lock,MDL)3.意向1.全局对整个数据库实例加,加后整个实例就处于只读状态;性能较差,数据逻辑备份时使用2.表级操作住整张表,定粒度大,发生冲突的概率高。

Javagoahead的博客 1622

一文读懂 MySQL

是计算机用以协调多个进程间并发访问同一共享资源的一种机制。MySQL中为了保证数据访问的一致性与有效性等功能,实现了机制,MySQL中的是在服务器层或者存储引擎层实现的。

说故事的五公子 8805

【史上最全】MySQL各种详解:一文搞懂MySQL的各种

隐式上(默认,自动加自动释放)显式上(手动)解(手动)1. 提交事务(commit)2. 回滚事务(rollback)3. kill 阻塞进程为什么上了写,别的事务还可以读操作?因为InnoD‍B有,可以使用快照读,而不会被阻塞。单个行记录上的(点查)Record Lock总是会去住索引记录,如果InnoDB存储引擎表建立的时候没有设置任何一个索引,这时InnoDB存储引擎会使用隐式的主键来进行定。

木牛的博客 7256

Mysql和表

总体来说,加索引可以减少对数据的定范围,提高数据库的并发性能,减少表延迟。但同时也需要注意索引的选择和使用,因为不合适的索引可能会增加数据库的负担,导致性能下降。在MySQL中,默认情况下,使用的是自动定(autocommit)模式,即每个SQL语句都会自动提交一个事务,并释放相应的。以上问题涉及到了数据库基本概念、的工作原理、性能优化等方面,通过深入理解这些问题,可以更好地应对相关的面试考核。在MySQL中,行和表是两种常见的定机制,它们用于控制对数据库中行或表的并发访问。

on_the_roadZZZ的博客 4809

MySQL——

MySQL——

qq_56086076的博客 1210

MySQL高级篇之

这个概念并不是MySQL数据库专有的,而是在多线程执行下,为了保证数据的正确性提出的。其中MySQL事务的隔离性是由来实现的。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制,因此产生了。同时,机制也为实现MSQL的各个隔离级别提供了保证。冲突也是影响数据库并发访问性能的一个重要因素。所以数据库而言显得尤其重要,也更加复杂。

qq_39126115的博客 1406

MySQL查看的sql

MySQL查看的sql

blood_Z的博客 1万+

MySQL

是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源(CPU,RAM,I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,数据库而言显得尤其重要,也更加复杂。MySQL中的,按照的粒度分,分为以下三类:全局数据库中的所有表表级:每次操作住整张表行级:每次操作住对应的行数据。

m0_70054514的博客 1148

mysql 加写_MySQL中的读和写

数据库机制中介绍过,数据的主要用来保证数据的一致性的,数据库定的粒度上可以分为表级、行级和页级。在我的博客中重点介绍过MySQL数据库的行级。这篇文章主要来介绍一下MySQL数据库中的表级。本文提到的读和写都是MySQL数据库的MyISAM引擎支持的表的。而对于行级的共享读和互斥写请阅读MySQL中的共享与排他。我习惯在描述表的时候按照读写来区分,在表述...

weixin_30558777的博客 2314

MYSQL的类型以及如何排查

MySQL 数据库中,机制是维护数据一致性和完整性的关键要素。的存在确保了多个事务在并发执行时不会相互干扰,从而避免数据的混乱和不一致。在复杂的数据库环境中,了解 MySQL 中的类型及其排查方法显得尤为重要,因为这不仅可以帮助开发人员和数据库管理员优化数据库性能,还能有效地排除故障,提升系统的稳定性。

qq_26733517的博客 2155

MySQL篇 』:MySQL 机制介绍

MySQL机制详解

m0_56361048的博客 8843

MySQL篇(机制 基本介绍、全局\表级\行、悲观\乐观

是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,数据库而言显得尤其重要,也更加复杂。全局就是对整个数据库实例加,加后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

思维码途 4481

MySQL-进阶篇-(全局、表级、行级

MySQL-进阶篇-(全局、表级、行级

聂可以的博客 8086
上一篇: 【MySQL】存储过程
下一篇: 【MySQL】InnoDB引擎
星鸦wyk
博客等级 码龄6年 1316粉丝 · 82原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星鸦wyk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值