0%

mysql锁

什么是锁

锁是计算机并发访问某一资源的机制, 如何保证数据并发访问的一致性, 有效性是所有数据库必须解决的问题, 锁冲突也是影响数据库并发访问性能的一个重要因素. 锁对数据库显的很重要, 也更复杂.

全局锁

锁定数据库所有的表, 加锁之后整个实例就处于只读状态, 后续的DML的写语句, DDL语句, 已经更新操作的事务提交语句都将被阻塞.

典型的场景就是做全库的逻辑备份, 对所有的表进行锁定, 从而获取一致性视图, 保证数据的完整性.

数据备份就是将数据备份成一个sql文件保存到磁盘中

如果不锁就会操作数据不一致的问题

image-20251221160815125

演示全局锁

加全局表

1
flush tables with read lock;

执行删除语句就会阻塞

image-20251221162243135

备份数据库

1
mysqldump -h localhost -uroot -pl198923. agileboot > /root/agileboot.sql

释放锁

image-20251221163613884

执行完之后阻塞的sql就可以执行成功了

image-20251221163732045

全局锁的问题

全局锁会导致备份时期业务不可用

但如果是主从结构, 主库写, 从库读, 在从库备份即可, 不会导致业务不可用, 但是会导致主从延迟.

InnoDB引擎中, 可以改变备份的方式(快照读), 完成不加锁的一致性数据备份

加参数--single-transaction

1
mysqldump --single-transaction -uroot -p123456 itcast > itcast.sql

表级锁—表锁

读锁

语法:

  1. 加锁: lock tables 表名 read/write

  2. 释放锁: unlock tables

  3. 读锁会限制读, 不影响本客户端读, 写的话直接报错, 不影响其他客户端读, 但会阻塞写

image-20251221172024619

image-20251221171426720

当解锁后就阻塞的就可以正常执行了

image-20251221171644147

写锁

  1. 加锁: lock tables 表名 read/write

  2. 释放锁: unlock tables

写锁本客户端可以读和写, 其他客户端不能读, 写

image-20251221172037324

image-20251221172746525

表级锁—意向锁