重温MySQL锁机制

文章目录 锁 锁分类 共享锁(读锁,读写互斥,读读互不影响) 排他锁(写锁,独占锁) 共享锁和排他锁的区别 表锁 意向锁:意向共享锁和意向排他锁 为什么需要加入意向锁 单个表

    <img src="https://img.mryunwei.com/uploads/2023/04/20230419071316524.jpg"><p>文章目录</p>锁锁分类共享锁(读锁,读写互斥,读读互不影响)排他锁(写锁,独占锁)共享锁和排他锁的区别表锁意向锁:意向共享锁和意向排他锁为什么需要加入意向锁单个表锁定全局表锁定行锁行锁升级为表锁(行锁实际是给索引加锁,如果没用索引而全表扫描,则会给全表加锁)修改、删除某一行记录,且未提交事务时,该行会一直被行锁锁定记录锁间隙锁(Gap Locks)间隙锁的作用:防止幻读innodb自动使用间隙锁的条件间隙锁锁定的区域next-key锁【临键锁】<p>记录锁、间隙锁、临间锁的区别</p>

推荐:mysql视频教程

锁是计算机协调多个线程访问同一共享资源的机制,主要用于解决多线程访问同一共享资源的并发安全问题。在这里插入图片描述

锁分类

(1)从性能分为:乐观锁和悲观锁 MySQL中采用版本号控制,JVM中使用CAS

(2)从数据库操作类型分为:读锁(共享锁)、写锁(排他锁) 【读锁和写锁都属于悲观锁】

注意: (1)读锁、写锁都属于行级锁,即事务1 对商品A 获取写锁,和事务2对商品B 获取写锁互相不会阻塞的。 (2)如果sql语句使用了行锁,当SQL未使用索引而使用全表扫描的时候,行级锁会变成表锁。

(3)锁只有在执行commit或者rollback的时候才会释放,并且所有的锁都是在同一时刻被释放。 (4)Innodb引擎执行普通的修改、删除sql语句时,会给修改和删除的行加行锁。

共享锁(读锁,读写互斥,读读互不影响)

事务A使用共享锁获取了某条(或某些)记录时,事务B可以读取这些记录,可以继续添加共享锁,但是不能修改这些记录(当事务C对这些数据修改或删除时,会进入阻塞状态,直至锁等待超时或者事务A提交)

使用场景: 读取结果集的最新版本,同时防止其他事务产生更新该结果集 例如:并发下对商品库存的操作

排他锁(写锁,独占锁)

select … for update在对读取的行记录加排他锁,只允许获取到该排他锁的事务修改该行记录,防止其他事务对该行进行修改,就像普通的update语句执行时会加行锁一样。

(1)一旦某个事务获取了排他锁,其他事务就无法再获取排他锁。 多个事务可以对相同行数据加共享锁。 (2)给指定行加了共享锁的事务,不一定能修改该行数据,因为其他事务也可能对该行加了共享锁或排他锁; 给指定行加了排他锁的事务,则可以修改加了排他锁的该行数据

表锁

使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 表锁一般在数据迁移时使用。

意向锁:意向共享锁和意向排他锁

某行加共享锁的前提是:该行数据所在表会先获取到意向共享锁。 某行加排他锁的前提是:该行数据所在表会先获取到意向排他锁。注意:意向共享锁和意向排他锁均是表锁,无法手动创建。

为什么需要加入意向锁

意向锁是为了告知mysql该表已经存在数据被加锁,而不需要逐行扫描是否加锁,提搞加锁的效率。

单个表锁定

在这里插入图片描述 上图中where条件中,虽然template_name建立普通索引,但使用or关键字,导致template_name的索引失效,从而进行了全表扫描,锁定了整张表。

修改、删除某一行记录,且未提交事务时,该行会一直被行锁锁定

在这里插入图片描述 窗口1中删除某一行,但没有提交。窗口2中更新该行会一直处于阻塞中。在这里插入图片描述

记录锁

经典参考文章

间隙锁的作用:防止幻读

间隙锁的目的是为了防止幻读,其主要通过两个方面实现这个目的: (1)防止止间隙内有新数据被插入 (2)防止范围内已存在的数据被更新

innodb自动使用间隙锁的条件

(1)数据隔离级别必须为可重复读 (2)检索条件必须使用索引(没有使用索引的话,mysql会全表扫描,那样会锁定整张表所有的记录,包括不存在的记录,此时其他事务不能修改不能删除不能添加)

间隙锁锁定的区域

根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,向右寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。下图中,where number=5的话,那么间隙锁的区间范围为[4,11];在这里插入图片描述

next-key锁其实包含了记录锁和间隙锁,即锁定一个范围,并且锁定记录本身。InnoDB默认加锁方式是next-key 锁。

next-key锁锁定的范围为间隙锁+记录锁,即区间(2,4),(4,5)加间隙锁,同时number=4的记录加记录锁,即next-key锁的锁定的范围为(2,4],(4,5]。

记录锁、间隙锁、临间锁的区别

在这里插入图片描述

推荐:mysql数据库(视频)

以上就是重温MySQL锁机制的详细内容,更多请关注每日运维其它相关文章!