一、表锁(MyISAM)
读锁(
READ
)会阻塞写,但不会阻塞读;写锁(WRITE
)会把写锁和读锁都阻塞
读锁阻塞写,写锁阻塞读和写
1、查看加锁的表
SHOW OPEN TABLES
2、设置加锁
- 读锁
LOCK TABLE table_name1 READ
session1会话对某个表加 READ
锁后,当前会话仅可以读该表。
session2(其他session)会话可读该表但不可写,等待session1释放 READ
锁后,session2可继续 WRITE
操作
2. 写锁
LOCK TABLE table_name1 WRITE
3、解锁
UNLOCK TABLES
二、行锁(InnoDB)
InnoDB有行级锁,针对的是一个事务,只有当前事务commit之后,才会释放锁。其他事务才可获取到锁并且执行。如过有多个事务同时争抢同一条数据,其余数据就得等待。
需要注意:索引失效,转全表扫描,行锁边表锁。
行锁性能分析
SHOW STATUS LIKE 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 | -- 当前等待锁的数量
| Innodb_row_lock_time | 13444 | -- 从系统启动到现在锁锁定总时长
| Innodb_row_lock_time_avg | 13444 | -- 每次等待所花费的平均时间
| Innodb_row_lock_time_max | 13444 | -- 等待最长的一次花费的时间
| Innodb_row_lock_waits | 1 | -- 系统到现在总公等待次数
+-------------------------------+-------+