锁的分类(四)

75 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情

本篇文章是锁的分类的最后一篇,在此之前讲过根据锁定资源粒度的大小划分为行锁和表锁,根据锁的态度特性分为悲观锁和乐观锁,今天将和掘友们描述的是其他锁(全局锁和死锁锁)。

1.全局锁

全局锁顾名思义就是对这个数据库实例进行上锁,那么什么场景会需要这种锁呢,做过数据库数据迁移的掘友们应该都知道,不了解的下面听完举例,当我们需要将数据备份或者迁移到云服务器上的数据库时,如果此时客户端还在运行那么数据就会不断地被操作,可能新增可能删除也可能修改,只有查询不会让数据变化,因此为了保证备份数据或迁移数据时数据的完整性和一致性,就会对这个数据库实例进行加锁让事务为只读的状态,加锁之后其他事务的新增、修改、删除、修改表结构、建表等语句都会被阻塞,只有select查询语句可以执行。

全局锁加锁使用:flush tables with read lock;

image.png

此时去查询

image.png

新增数据发现阻塞

image.png

2.死锁

死锁,指的是在事务竞争的情况下,多个事务之间相互持有对方需要的资源不放且都希望对方释放资源给自己使用造成事务之间相互等待的现象,这种现象就是死锁。

查看当前表的数据记录

image.png

直接上例子,开启事务一修改id为1的记录且不提交事务,执行SQL: update test_index set test_add = '1' where id = 1;

image.png

开启事务二修改id为2的记录且不提交事务,执行SQL: update test_index set test_add = '1' where id = 2;

image.png

先让事务二去修改id为1的记录,观察事务情况

image.png

此时事务一去修改id为2的记录,观察情况 image.png

出现死锁的情况,此时mysql主动发现且将占用undo日志最少的事务回滚。