暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片
MySQL锁知识总结.pdf
244
20页
13次
2023-05-23
5墨值下载
MySQL 锁知识点总结
一、基本概
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。
而锁就是用来实现这些访问规则的重要数据结构。
根据加锁的范围,MySQL 的锁大致分为全局锁、表级锁和行锁三类。
二、加锁方式及原
2.1 全局锁
全局锁就是对整个数据库实例加锁。当开启全局锁,整个库就处于只读状态,之后其他线程的以下语句会被阻塞:数据更新语
DML(数据的增删改)、数据定义语句 DDL(包括建表、修改表结构等)和更新类事务的提交语句。
使用场景:全库逻辑备份
使用命令: Flush tables with read lock (简称 FTWRL),新版本已经使用 --single-transaction 替代了 FTWRL。
【FTWRL 对主从的影响】
1、主库执行 FTWRL 后,主库就不能执行更新,业务基本上就得停摆;
2、从库上执行 FTWRL 后,从库不能执行主库同步过来的 binlog,会导致主从延迟。
2.2 表级锁
MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。
<1> 表锁
表锁的语法是 lock tables … read/write。与 FTWRL 类似,可以用 unlock tables 主动释放锁,也可以在客户端断开的时候
自动释放。需要注意,lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。
【加锁方式】
如果在某个线程 A 中执行 lock tables t read, t1 write;
则其他线程写 t、读写 t1 的语句都会被阻塞。
同时,线程 A 在执行 unlock tables 之前,也只能执行读 t、读写 t1 的操作。连写 t 都不允许,自然也不能访问其他表。
<2> MDL
另一类表级的锁是 MDL(metadata lock)。MDL 不需要显式使用,在访问一个表的时候会被自动加上。MDL 的作用是,保证读写
的正确性。假如一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结
果跟表结构对不上,所以必须要加 MDL 锁来保证读写的正确性。
【加锁方式】
对一个表做增删改查时,加 MDL 读锁;对表做结构变更操作时,加 MDL 写锁。
读锁之间不互斥,可以多个线程同时对数据进行增删改查;
读锁与写锁,写锁与写锁之间是互斥的,也就是说当数据结构变更时,是无法执行增删改查或者其他数据结构变更的。
2.3 行级锁
MySQL 的行锁是在引擎层实现的,只有支持事务的引擎才有行锁,最常见的就是 InnoDB 引擎。比如 MyISAM 引擎不支持事务,
以就没有行锁,所以它要实现并发控制的时候只能使用表锁。
<1> 两阶段锁
两阶段锁是指在同一个事务内,对所涉及的所有数据项进行先加锁(第一阶段),然后才对所有的数据项解锁(第二阶段)。
其中,在第一阶段加共享锁后影响了其他事务的写操作、加排它锁后影响了其他事务的读操作(此时,读写都受影响),所以较大地
影响了其他事务的运行(如果不操作相同数据项则互不影响)。只有在第二阶段释放了所有的数据项上的锁之后,才能运行其他要操
作相同数据项的事务。也就是说,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放。
【建议】
如果事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放,这样可以减少事务持有锁的时间。
<2> 死锁
当并发系统中线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状
态。
数据库默认会发起死锁检测(innodb detect),发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执,其
优先级最高。
参数 innodb_deadlock_detect =on,表示开启死锁检测(默认是开启状态)
--查看
root@localhost: 15:06: [test]> show variables like "%innodb_deadlock%";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| innodb_deadlock_detect | ON |
+------------------------+-------+
1 row in set (0.00 sec)
of 20
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。