Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9b8afa3

Browse files
committed
丰富锁的内容
1 parent 977472f commit 9b8afa3

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

‎locks.adoc

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,59 @@
11
[#locks]
22
= 锁
33

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+
421
* *共享锁 Shared Lock*,简称 S 锁
522
* *独占锁 Exclusive Lock*,也称排他锁,简称 X 锁
623
* *意向共享锁 Intention Shared Lock*,简称 IS 锁。当事务准备在某条记录上加 S 锁时,需要先在表级别加一个 IS 锁。
724
* *意向独占锁 Intention Exclusive Lock*,简称 IX 锁。当事务准备在某条记录上加 X 锁时,需要先在表级别加一个 IX 锁。
825

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+
=== 隐式锁

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /