5.MySQL的事务与锁(2)

2021-02-24  本文已影响0人  农民工进城

本章要点

1.锁类型
2.锁范围
3.死锁

1.锁类型

1.1 锁粒度分类

MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。

全局锁

表级锁
MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。

表锁: 开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低。

行锁
InnoDB只有通过索引条件检索数据才使用行级锁,否则,InnoDB使用表锁也就是说,InnoDB的行锁是基于索引的。

行锁: 开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高 不同的存储引擎支持的锁粒度是不一样的。
InnoDB和MyISAM有两个本质的区别:InnoDB支持行锁、InnoDB支持事务。

InnoDB实现了以下两种类型的行锁:

另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁:

InnoDB行锁和表锁都支持、MyISAM只支持表锁!

间隙锁
当用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁(左开右开),这种锁机制就是所谓的间隙锁,即Next-Key锁(左开右闭)。
InnoDB间隙锁解决了幻读问题

image.png

2.锁范围

3. 死锁

死锁:指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB。

3.1锁相关信息

*** 默认锁等待时间***
MySQL 有一个参数来控制获取锁的等待时间,默认是 50 秒

show VARIABLES like 'innodb_lock_wait_timeout';

锁相关信息查询

show status like 'innodb_row_lock_%';
image.png
select * from information_schema.INNODB_TRX; -- 当前运行的所有事务 ,还有具体的语句
select * from information_schema.INNODB_LOCKS; -- 当前出现的锁
select * from information_schema.INNODB_LOCK_WAITS; -- 锁等待的对应关系
3.2 避免死锁
上一篇 下一篇

猜你喜欢

热点阅读