mysql锁
什么是锁
锁是计算机并发访问某一资源的机制, 如何保证数据并发访问的一致性, 有效性是所有数据库必须解决的问题, 锁冲突也是影响数据库并发访问性能的一个重要因素. 锁对数据库显的很重要, 也更复杂.
全局锁
锁定数据库所有的表, 加锁之后整个实例就处于只读状态, 后续的DML的写语句, DDL语句, 已经更新操作的事务提交语句都将被阻塞.
典型的场景就是做全库的逻辑备份, 对所有的表进行锁定, 从而获取一致性视图, 保证数据的完整性.
数据备份就是将数据备份成一个sql文件保存到磁盘中
如果不锁就会操作数据不一致的问题

演示全局锁
加全局表
1 | flush tables with read lock; |
执行删除语句就会阻塞
备份数据库
1 | mysqldump -h localhost -uroot -pl198923. agileboot > /root/agileboot.sql |
释放锁
执行完之后阻塞的sql就可以执行成功了
全局锁的问题
全局锁会导致备份时期业务不可用
但如果是主从结构, 主库写, 从库读, 在从库备份即可, 不会导致业务不可用, 但是会导致主从延迟.
InnoDB引擎中, 可以改变备份的方式(快照读), 完成不加锁的一致性数据备份
加参数--single-transaction
1 | mysqldump --single-transaction -uroot -p123456 itcast > itcast.sql |
表级锁—表锁
读锁
语法:
加锁:
lock tables 表名 read/write释放锁:
unlock tables读锁会限制读, 不影响本客户端读, 写的话直接报错, 不影响其他客户端读, 但会阻塞写

当解锁后就阻塞的就可以正常执行了
写锁
加锁:
lock tables 表名 read/write释放锁:
unlock tables
写锁本客户端可以读和写, 其他客户端不能读, 写

