- MySQL提供了一个全局读缩Flush tables with read lock,加锁后整个库处于只读状态,之后其他线程的一下语句将被阻塞:数据更新语句(增删改),数据的定义语句(建表,修改表结构)和更新类事务的提交语句。
- 全局锁的典型使用场景是,做全局逻辑备份。
- 之所以在全局备份时候要加全局读锁是因为要保证数据的一致性。不能在数据备份过程中,某几调数据被修改,这样备份出来的数据就不是一致性视图了。
- mysqldump使用参数-single-transaction参数可以实现在导数据之前启动一个事务,来确保拿到的一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。
- 一致性读是好,但前提是引擎要支持这个隔离级别。
- 表锁,对表加读锁后,自己也不能对其进行修改;自己和其他线程只能读取该表。当对某个表加写锁后,该线程可以对表进行读写,其他线程对该表的读和写都受到阻塞。影响范围大,现在不常用。
- 元素局锁(MetaData Lock)是server层的锁,表级锁。主要用于隔离DML(Data Manipulation Language, 数据操纵语言,如select)和 DDL(Data Definition Language,数据定义语言,如该表头新增一列)操作之前的干扰。每执行一行DML、DDL语言时都会申请MDL锁,MDL加锁过程是系统自动控制,无法直接干预,读读共享,读写互斥,写写互斥。
- 对表加索引、加字段或修改字段都需要扫描全表的数据。
- 一下这个例子
- 事务A先执行,获得MDL读锁,事务B执行,不冲突,也可执行。到事务C要修改增加表项,阻塞。事务D执行也要读锁,也会被阻塞。直到事务C执行完毕之后,才可以执行之后的事务。原因是申请MDL锁的操作会形成一个队列,队列中写锁获取优先级高于读锁,所以会阻塞之后的所有读写操作。详细解释参照:https://blog.csdn.net/q2878948/article/details/96430129
- 如果对一个事务繁忙的表进行alter table操作该如何呢,在 alter table 语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到 MDL 写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后开发人员或者 DBA 再通过重试命令重复这个过程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。