0%

MySQL锁机制

MySQL锁机制

MySQL包含表锁、行锁和页锁

表锁(偏读)

表锁偏向于MyISAM存储引擎,开销小,加锁快;无死锁;锁的粒度大,并发小

为表加锁

1
2
# 为user表加上读锁,good表加上写锁
lock table user read,good write;

解锁

1
unlock tables;

查看当前哪些表在使用中

1
2
3
show open tables;
+--------------------+------------------------------------------------------+--------+-------------+
| Database | Table | In_use | Name_locked |

分析表锁定

1
2
3
4
5
6
7
8
9
10
 show status like 'table_lock%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Table_locks_immediate | 122 |
| Table_locks_waited | 0 |
+-----------------------+-------+

Table_locks_immediate 产生表级锁的次数
Table_locks_waited 出现由于表级锁导致等待的次数

读锁

如果在整张表上加了读锁,当前会话不可以修改该表数据,不可以查询/修改其他表数据,只能读取该表数据;其他会话可以查询该表数据,可以查询/修改其他表数据,但是如果修改该表数据,会进行阻塞,直到解锁为止

写锁

如果在整张表加了写锁,当前会话可以查询/修改该表数据,但是不可以对其他表进行操作;其他会话在对该表进行查询/修改时会进行阻塞,直到解锁为止,可以查询/修改其他表

行锁(偏写)

偏向于Innodb存储引擎,开销大,加锁慢;会出现死锁;锁粒度小,并发高

分析行锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
show status like 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
+-------------------------------+-------+


Innodb_row_lock_current_waits 当前正在等待锁定的数量
Innodb_row_lock_time 锁定的总时间总时间长度
Innodb_row_lock_time_avg 每次等待所花平均长度
Innodb_row_lock_time_max 等待的最长时间
Innodb_row_lock_waits 等待的次数