Mysql为什么要加锁(深入理解MySQL数据库各种锁(总结))

2023-12-11 20:20:10 :45

mysql为什么要加锁(深入理解MySQL数据库各种锁(总结))

本篇文章给大家谈谈mysql为什么要加锁,以及深入理解MySQL数据库各种锁(总结)对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文目录

深入理解MySQL数据库各种锁(总结)

MyISAM和InnoDB存储引擎使用的锁:

封锁粒度小:

由于InnoDB存储引擎支持的是行级别的锁,因此意向锁(因为意向锁是表锁)其实不会阻塞除全表扫以外的任何请求。故表级意向锁与行级锁的兼容性如下所示

参考

参考

行锁的三种算法:

这条语句阻止其他事务插入10和20之间的数字,无论这个数字是否存在。 间隙可以跨越0个,单个或多个索引值。

***隐藏网址***

共享锁:

排他锁:

***隐藏网址***

乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改(天真), 操作数据时不会上锁 ,但是 更新时会判断在此期间有没有别的事务更新这个数据,若被更新过,则失败重试 ;适用于读多写少的场景。

乐观锁的实现方式 有:

关闭自动提交后,我们需要手动开启事务。

上述就实现了悲观锁,悲观锁就是悲观主义者,它会认为我们在事务A中操作数据1的时候,一定会有事务B来修改数据1,所以,在第2步我们将数据查询出来后直接加上排它锁(X)锁,防止别的事务来修改事务1,直到我们commit后,才释放了排它锁。

javamysql乐观锁为什么能防止死锁

数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

MYSQL为什么要锁表 有什么好处

给高并发情况下的mysql进行更好的优化MySQL有三种锁的级别:页级、表级、行级,这3种锁的特性可大致归纳如下: 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

mysql锁的简单想法(不确定对不对)

事务可以看见其他未提交事务的修改。会导致脏读。

事务只能看见其他提交事务的修改。但是如果事务A读取一批数据set,其他事务之后修改了这个数据set并提交(此时事务A没有提交),这时事务A再读取数据set就跟第一次读取的结果不一致。会导致不可重复读。

在事务执行过程中,重复读到的数据是一致的

事务A读到了事务B未提交的数据。(read uncommitted)

事务A第一次读取行num,此时事务B修改行num并提交,事务A再读行num,数据会发生变化。(read uncommitted, read committed)

事务A第一次查询范围query_range,返回n行,此时事务B在该查询范围内插入了一行数据并提交,事务A再次查询范围query_range会看到B插入的数据。(read uncommitted, read committed, repeatable read)

在同一个事务执行过程中,两次相同的查询,但是查询的返回数据行数不同。

开启sessionA, sessionB

此时锁(行锁、gap锁)的情况如下图,标红为加锁,采用next key lock。(不光在索引a上加锁,索引a中3所对应的主键索引也会加锁,只画了索引a) 注意:这里是主键索引的顺序与a索引的顺序一致的情况。一致的情况下,新插入的4会插入在原来的4之后。我们定义函数index_key(x), 表示获取x所对应的主键索引,new(x)表示新插入的x,old(x)表示已经存在的x。如果index_key(old(4))》index_key(new(4)),那新的4是插不进去的,因为新的4会被放在老的4的前面。同理,新插入的2也有可能插入进去(只要index_key(new(2))《index_key(old(2)))。具体的例子整理后发出

对于sessionB,插入2,3失败,插入4成功。(如图lock.png,新插入的2会被2与3之间gap锁阻止,新插入的3肯定失败,但是新插入的4就没问题)

开启sessionA:

这个时候情况如下图所示:

如果按照实例1的分析,不看主键索引id,应该插入(id=4,a=3)应该会被gap锁锁定,但是事实是可以插入成功。因为插入的(i4=d,a=3)放在了(id=5,a=3)的上面。 同样的道理,不看主键索引id,通过实例1的分析,插入(id=6,a=7)应该可以插入,但是事实不行,因为(id=6,a=7)被a=5与a=7之间的gap锁阻止了。 新插入的(id=4, a=3),需要判断会插入在(id=5, a=3)之前还是之后,很明显之前(4《5),那么(id=3, a=5)与(id=5, a=3)之间的gap锁不会阻止。 新插入的(id=6, a=7),需要判断会插入在(id=7, a=7)之前还是之后,很明显之前(6《7),那么(id=6, a=7)会被(id=3, a=5)与(id=5, a=3)与(id=7, a=7)之间的gap锁阻止。

文章分享结束,mysql为什么要加锁和深入理解MySQL数据库各种锁(总结)的答案你都知道了吗?欢迎再次光临本站哦!

mysql为什么要加锁(深入理解MySQL数据库各种锁(总结))

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.