MySql存储引擎中的锁
2024-04-10 05:20:53  阅读数 407

一、概念:

  • 什么是锁?主要是为了解决客户端并发读写造成冲突问题,将读写操作进行锁定的功能

二、表加锁的类型:

  • 读锁:又称为共享锁,对数据做查询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;

# 回到第二个连接,
# 查和写的命令都可以执行了