File tree 1 file changed +51
-1
lines changed
1 file changed +51
-1
lines changed Original file line number Diff line number Diff line change 1
1
[#locks]
2
2
= 锁
3
3
4
+ == 全局锁
5
+
6
+ 全局锁就是对整个数据库实例加锁。
7
+
8
+ . `FLUSH TABLES WITH READ LOCK` -- 简称 FTWRL。让整个库处于只读状态,数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句都会被阻塞。通常用于全库逻辑备份,保证数据是出于某个时间点的。如果客户端链接异常中断,那么锁会自动释放。
9
+ . `mysqldump` + `–single-transaction` 参数 -- 当 `mysqldump` 使用参数 `–single-transaction` 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。这就要求引擎支持 MVCC,像 MyISAM 引擎就不行。
10
+ . `SET GLOBAL readonly = TRUE` -- 客户端链接断开也不会释放锁;通常判断是否为只读库也是使用 `readonly` 的值来判断,影响面更大。
11
+
12
+ FTWRL 前有读写的话, FTWRL 都会等待读写执行完毕后才执行。FTWRL 执行的时候要刷脏页的数据到磁盘,因为要保持数据的一致性 ,理解的执行 FTWRL 时候是 所有事务 都提交完毕的时候。
13
+
14
+
15
+ 全库只读 `readonly = true` 在 slave 上,如果用户有超级权限的话 readonly 是失效的。
16
+
17
+ == 表级锁
18
+
19
+ === 表锁 `LOCK TABLES tableName READ/WRITE`
20
+
4
21
* *共享锁 Shared Lock*,简称 S 锁
5
22
* *独占锁 Exclusive Lock*,也称排他锁,简称 X 锁
6
23
* *意向共享锁 Intention Shared Lock*,简称 IS 锁。当事务准备在某条记录上加 S 锁时,需要先在表级别加一个 IS 锁。
7
24
* *意向独占锁 Intention Exclusive Lock*,简称 IX 锁。当事务准备在某条记录上加 X 锁时,需要先在表级别加一个 IX 锁。
8
25
9
- NOTE: 意向共享锁 和 意向独占锁 并不是真正的锁,而是相当于一个公告牌。表示有记录被锁定了。避免在锁表(对表加 共享锁 或 独占锁 时去遍历全部记录。)
26
+ NOTE: 意向共享锁 和 意向独占锁 并不是真正的锁,而是相当于一个公告牌。表示有记录被锁定了。避免在锁表(对表加 共享锁 或 独占锁 时去遍历全部记录。)
27
+
28
+ === 元数据锁 MDL(metadata lock)
29
+
30
+ 当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁。
31
+
32
+ 另外,MDL 锁是自动加的,如果事务长时间不提交,也会导致整个库挂掉。所以,要尽量避免耗时长的事务。
33
+
34
+ === AUTO-INC 锁
35
+
36
+ AUTO_INCREMENT 有两种实现方式:
37
+
38
+ . AUTO-INC 锁,在执行插入语句时,就加一个表级别的 AUTO-INC 锁,然后为每条待插入记录的 AUTO_INCREMENT 列分配递增的值。锁单个插入语句,完成插入即释放锁。
39
+ . 轻量级锁,为插入语句的 AUTO_INCREMENT 列获取轻量级锁,在生成所需要的值后,就释放该锁,而不需要等待完成插入后才释放。插入数据有可能是乱序的,导致主从复制不安全。
40
+
41
+ 可以通过设置 `innodb_autoinc_lock_mode` 来控制使用哪种方式: `0` 即 AUTO-INC 锁;`2` 即轻量级锁; `1` 是混着用(插入数量确定时采用轻量级锁;不确定时采用 AUTO-INC 锁)。
42
+
43
+
44
+ == 行锁
45
+
46
+ // * *共享锁 Shared Lock*,简称 S 锁
47
+ // * *独占锁 Exclusive Lock*,也称排他锁,简称 X 锁
48
+
49
+ === Record Lock
50
+
51
+ === 间隙锁 Gap Lock
52
+
53
+ === Next-Key Lock
54
+
55
+ Next-Key Lock = Record Lock + Gap Lock。
56
+
57
+ === 插入意向锁 Insert Intention Lock
58
+
59
+ === 隐式锁
You can’t perform that action at this time.
0 commit comments