MySql存储引擎中的锁
2023-02-15 本文已影响0人
技术老男孩
一、概念:
- 什么是锁?主要是为了解决客户端并发读写造成冲突问题,将读写操作进行锁定的功能
二、表加锁的类型:
- 读锁:又称为共享锁,对数据做查询select 访问MySQL服务自动给 表加读锁,加了读锁的表,允许多个连接同时对同一张表做查询访问(加锁期间 允许同时读,不允许写)
- 写锁:又称排它锁或互斥锁,对数据做写访问(insert | delete | update )时 , MySQL服务会自动给表加写锁(加锁期间 不允许读和写)
三、表加锁的范围(锁粒度):
- 行级锁:仅仅对被访问的行分别加锁,没有被访问的行不加锁
- 表级锁:只要是对表做访问,就会把整张表加锁(不管访问的是1行 还是更多行)
四、相关命令:
SQL命令 | 说明 |
---|---|
show open tables where in_user>0; | 查看最近被锁的表 |
show status like "table_locks%" | 查看锁表状态 |
show status like "Table_locks_immediate%" | 立即获得表级锁的次数 |
show status like "Table_locks_waited%" | 不能立即获取表级锁而需要等待的次数 |
lock tables 表名 read; | 表加读锁 |
lock tables 表名 write; | 表加写锁 |
unlock tables; | 释放锁 |
五、使用示例:
- 读锁例子
# 第一个连接
]#mysql -uroot -p密码
# 开启读锁
Mysql> Lock tables tarena.salary read;
# 查询数据正常
Mysql> select * from tarena.salary;
# 第二个连接
]#-uroot -p密码
# 查询数据正常
Mysql> select * from tarena.salary;
# 插入数据 客户端显示等待
Mysql> insert into tarena.salary(employee_id,basic) values(1,20000);
# 回到第一个连接
# 释放读锁
MySQL> Unlock tables;
# 回到第二个连接
# Insert命令执行成功
- 写锁例子
# 第一个连接
]#mysql -uroot -p密码
# 开启写锁
Mysql> Lock tables tarena.salary write;
# 第二个连接
]#-uroot -p密码
# 查询数据 客户端显示等待
Mysql> select * from tarena.salary;
# 插入数据 客户端也显示等待
Mysql> insert into tarena.salary(
employee_id,basic
) values(1,20000);
# 回到第一个连接
# 释放锁
MySQL> Unlock tables;
# 回到第二个连接,
# 查和写的命令都可以执行了