Mysql锁

痴心易碎 提交于 2020-02-01 11:38:49

Mysql有三种锁:表锁(偏读)、行锁(偏写)、页锁

1. 查看锁命令

1.1 查看锁

show open tables;

In_use为0表示没有被锁
在这里插入图片描述

1.2 分析表锁定

show status like '%table%'
  • Table_locks_immediate:产生表级锁定的次数(锁的查询次数)。
  • Table_locks_waited:出现表级锁定争用而发生等待的次数,此值高说明存在严重表级锁争用情况。

2. 表锁

2.1 读锁(共享锁)

Session 1 为Table增加读锁之后:

  • Session 1 只能读锁定表,不能读其他表,写锁定表报错
  • Session 2 可以读任何表,写锁定表阻塞

2.2 写锁(独占锁)

Session 1 为Table增加写锁之后:

  • Session 1 可以做锁定表进行任何操作
  • Session 2 无法对锁定表进行任何操作

2.3 相关命令

加读锁

lock table 表名1 read, 表名2 read;

加写锁

lock table 表名1 read, 表名2 read;

解锁

unlock tables;

3. 行锁

3.1 开启事务即开启了行锁

提交事务之前,其它会话查询到的都是未提交的数据,如果更新了同一行,会被阻塞,直到这个事务被提交。

set autocommit = 0;
update dept set dname = '开发部2' where deptno = 1; 
commit;

3.2 手动上锁

当查询deptno=1的数据的时候,加for update语句,此时其它会话修改这条记录就会被阻塞。

select * from dept where deptno = 1 for update;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!