MySQL 面试题:锁
什么是全局锁?全局锁的使用场景?MySQL 如何避免加锁?
-
全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
-
全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。
-
当 mysqldump 使用参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
表级锁的种类?
- 表级锁有两种,一种是针对于表记录数据的锁,另外一种就是MDL(metadata lock)的锁,它是基于表元数据(表结构)的锁,MDL锁是为了保证并发环境下读写的正确性。
什么时候加 MDL 锁?
-
MDL读锁:在我们对表数据进行增删改查的的时候都需要对表加MDL读锁。
-
MDL写锁:当我们对表结构进行修改的时候会加MDL写锁。
-
读锁与写锁互斥,写锁与写锁互斥,读锁与读锁不影响。
-
事务中的 MDL 锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。
什么是行锁?
- 顾名思义,行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。
如果没有行锁,只有表锁会产生什么影响?
- 表锁同一张表在同一时刻只能有一个更新。
怎么减少行锁对性能的影响?
- 在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放.如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放.
- 处理死锁:1.超时机制,线程超时退出。2.死锁检测,出现死锁,回滚死锁链条中的任意事务。
浙公网安备 33010602011771号