Parcourir la source

全局锁和表锁(1)

YWJL il y a 2 ans
Parent
commit
99be2a2dc1

BIN
mysql/mysql实战45讲.assets/7cf6a3bf90d72d1f0fc156ececdfb0ce.jpg


+ 48 - 0
mysql/mysql实战45讲.md

@@ -356,9 +356,57 @@ InnoDB中,聚簇索引不一定是主键,但主键一定是聚簇索引。
 
 对于全部是InnoDB引擎的库,官方自带的逻辑备份工具是 mysqldump ,使用 -single-transaction 参数,导数据之前就会启动一个事务,来确保拿到一致性使徒。由于MVCC的支持,在此过程中数据是正常更新的。
 
+*但是single-transaction 方法只适用于所有的表使用事务引擎的库*
 
+对于不支持事务的引擎,备份只能通过FTWRL方法。正因此,DBA要求业务开发使用InnoDB替代MyISAM
 
+FTWRL(Flush tables with read lock)
+当你需要让整个库处于只读状态的时候,可以使用这个命令,使用后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
 
+**FTWRL 比 set global readonly=true 更安全**
+
+1. global的影响更大
+2. 整个库设置成`readonly`后如果客户端发生异常,数据库会保持一直保持`readonly`的状态,风险较大
+
+### 表级锁
+
+#### 表锁
+
+语法:lock tables ... read/write
+
+可以用`unlocks tables`主动释放,也可以断开连接时自动释放。
+
+注意:lock tables 不仅仅是限制别的线程的读写,对于本线程接下来的操作也会限制。
+
+lock tables t1 read, t2 write;
+```
+1、lock table t1 read 当前线程只能对t1表read ,不能write,当前线程对其它表不能read,write, 其它线程对表t1的DML操作都会metalock锁等待,对其它表没影响 
+2、lock table t1 write write带read权限,当前线程可以对指定表t1进行read ,write ,对其它表不行。 其它线程不能对表t1read,write ,其它表可以正常操作。
+```
+
+
+
+#### MDL(metadata lock)
+
+MDL的作用是,保证读写的正确性。是隐式执行的
+
+MySQL 5.5 中引入 MDL,当对一个表进行增删改查的操作时,加MDL读锁;要对表做结构变更操作时,加MDL读锁
+
+- 读锁之键不互斥
+- 读写锁之键、写锁之键是互斥的。
+
+![img](mysql实战45讲.assets/7cf6a3bf90d72d1f0fc156ececdfb0ce.jpg)
+
+*注意:MDL锁的例子。因为sessionB加了MDL读锁,导致后面的sessionC阻塞。如果sessionB一直没有完成select,那么sessionC申请写锁被阻塞,将会导致后面的sessionD等申请读锁都被阻塞。*
+
+### 如何安全的给小表加字段
+
+1. 解决长事务。长事务不提交,会一直占用MDL。可以考虑kill掉长事务
+2. 如果是更新频繁的热点表,不得不加字段的话。在alter table 语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到 MDL 写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后开发人员或者 DBA 再通过重试命令重复这个过程。
+
+
+
+# 事务到底是否是隔离的