数据库锁设计的初衷是处理并发问题。
作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。
全局锁
全局锁就是对整个数据库实例加锁,命令:
-- 加锁,因为该命令一般也被叫做FTWRL
Flush tables with read lock
-- 解锁(会话断开时,全局锁会被自动释放)
unlock tables
加全局锁后,其他线程的以下语句会被阻塞:
- 数据更新语句(数据的增删改);
- 数据定义语句(包括建表、修改表结构等;
- 更新类事务的提交语句。
比如此时执行delete
语句,会返回:
Error Code: 1223. Can't execute the query because you have a conflicting read lock
待续...