MySQL数据库的锁分为全局锁、表级锁、行级锁,这一篇介绍的是MySQL全局锁的使用。
MySQL全局锁用于对一个数据库实例加锁,加了全局锁后该数据库实例将处于只读状态,可以执行查询语句,但执行DML、DDL语句则会被阻塞。MySQL全局锁的典型使用场景是用于数据库的全库备份。
加锁的语法为:
flush tables with read lock;
释放锁的语法为:
unlock tables;
如果关闭了数据库连接,全局锁也会自动释放。
需要注意的一点是,释放锁时只会释放当前会话的锁,不会释放其他会话的锁。
下面是一个备份数据库的例子。
备份数据库按以下步骤执行:
1.加全局锁
flush tables with read lock;
2.备份数据库
mysqldump -uroot -p123456 study > D:\1.sql
注意:这是一个命令,不是SQL语句,要在执行命令的地方执行啊。
3.释放全局锁
unlock tables;
在实际使用过程中,可能存在多个会话的情况,下面就多个会话的一些情况做说明。
1. flush tables with read lock在同一会话内可以反复执行,效果一样。
2. 会话1执行flush tables with read lock后,会话2也可以执行flush tables with read lock。
3. 会话1执行flush tables with read lock后,当前会话可以执行查询语句,但执行DML、DDL会报错:1223 - Can't execute the query because you have a conflicting read lock。
4. 会话1执行flush tables with read lock后,其他会话可以执行查询语句,但执行DML、DDL会阻塞。当会话1释放全局锁后,其他会话正在执行的语句会继续执行。