MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)

1.概述

前面章节之所以介绍那么多锁的知识点和示例,其实最终目的就是为了排查与解决死锁的问题,下面我们把之前学过锁知识重温与补充一遍,然后再通过例子演示下如果排查与解决死锁。

2.前期准备

●数据库事务隔离级别

SHOW VARIABLES LIKE 'transaction_isolation%';

 

MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)_第1张图片

 MYSQL事务隔离级别默认可重复读(如果还不了解事务隔离级别的鞋童们,可以移步到我写这篇文章去了解下)。
●将事务自动提交关闭

SET AUTOCOMMIT=0;

事务自动提交配置:0.事务非自动提交,1.事务自动提交
●创建一个模拟演示用的会员表

CREATE TABLE goods.members (`ID` int NOT NULL AUTO_INCREMENT COMMENT '会员自增ID',`MemberName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '会员名称',`Tel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号码',PRIMARY KEY (`ID`));

 在MemberName会员名称字段上建立一个非聚集索引

ALTER TABLE goods.members ADD INDEX IX_MemberName(MemberName);
SHOW INDEX FROM goods.members;

 

往会员表插入四条数据,方便间隙锁跟记录锁例子演示

INSERT INTO goods.members (MemberName,Tel) VALUES ('A','110'),('B','120'),('C','130'),('D','140');

 

SELECT * FROM goods.members;

 

MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)_第2张图片 

好了,前期条件已经准备完毕,在演示之前,下面让我们来重温与补充下锁知识。

3.锁知识重温与补充

3.1锁的介绍

 MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)_第3张图片

 

下面就根据上述图再次重温与补充下之前学习过锁的知识点。

3.2乐观锁与悲观锁

悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念。
●悲观锁(Pessimistic Lock)
悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select...for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。
●乐观锁(Optimistic Lock)
乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳。例如UPDATE SET data = new_data, version = new_version WHERE version = old_version;

3.3共享锁与排他锁

InnoDB存储引擎有主要两种类型的行锁:
●共享锁(S锁):允许持锁事务读取数据行。
●排他锁(X锁):允许持锁事务更新或者删除数据行。
假设事务T1持有R记录行S锁,事务T2请求获取R记录行时,会做如下处理:
◎T2请求S锁会被允许,结果T1,T2都会持有R记录S锁。
◎T2请求X锁不会允许,需要等待T1释放S锁。
同理,假设事务T1持有R记录行X锁,事务T2请求持有R记录行S、X锁时,会做如下处理:
◎T2必须等待T1释放X锁才可以操作R记录行,因为S锁与X锁不兼容。

3.4意向锁

●意向共享锁(IS锁)

你可能感兴趣的:(sql,mysql,数据库)