博客
关于我
全局锁和表锁 :给表加个字段怎么有这么多阻碍?
阅读量:351 次
发布时间:2019-03-04

本文共 1308 字,大约阅读时间需要 4 分钟。

MySQL 锁机制是数据库管理中的重要组成部分,用于确保数据操作的并发控制和一致性。MySQL 中的锁可以分为全局锁、表级锁等多种类型。本文将重点探讨全局锁和表级锁的特点、使用场景以及相关风险。

全局锁

全局锁是对整个数据库实例加锁的一种机制,主要用于在数据库层面上进行控制。MySQL 提供了Flush tables with read lock(FTWRL)命令,可以让整个数据库进入只读状态。使用该命令后,所有数据更新操作(如INSERT、UPDATE、DELETE)和数据定义操作(如ALTER TABLE)都会被阻塞,确保在备份期间不会有数据丢失或逻辑错误。

使用场景

  • 全库逻辑备份:这是全局锁的主要用途。在进行全库逻辑备份时,确保所有数据的一致性和完整性。例如,使用mysqldump工具进行备份时,可以通过指定--single-transaction参数,确保在备份过程中所有数据变化都在同一个事务中完成。

风险

  • 主库备份期间不能更新:在主库进行全局锁备份时,必须确保在备份期间没有任何数据更新操作,否则会导致业务中断。
  • 从库备份影响主从同步:在从库进行全局锁备份时,可能会导致主库的二进制日志同步受阻,进而导致主从延迟。

此外,全局锁还可以通过设置set global readonly=true的方式实现全库只读。但这种方法存在以下风险:

  • 潜在逻辑依赖:某些系统可能会将readonly状态用于其他逻辑判断(如判断主备状态),这会导致管理机制的不一致性。
  • 异常处理问题:如果客户端在执行FTWRL命令后发生异常断开,MySQL会自动释放全局锁,而set global readonly=true则不会有这种机制,可能导致数据库长时间处于不可写状态。
  • 权限问题:在从库上,如果有用户拥有超级权限,readonly状态会被忽略,可能导致数据写入操作。

表级锁

表级锁是对数据库表进行加锁的一种机制,MySQL 中的表级锁有两种:表锁和元数据锁(MDL)。

表锁

表锁的语法是lock tables ... read/write,用于对特定表或多个表进行加锁。需要注意的是,表锁不仅会限制其他线程的读写,还会限制当前线程的操作对象。

  • InnoDB的行锁支持:由于InnoDB引擎支持行锁,通常不会使用表锁来控制并发,因为表锁的锁范围过大,可能对业务逻辑造成较大影响。

元数据锁(MDL)

元数据锁是对表结构和其他元数据进行加锁的一种机制,其特点是自动加上,不需要显式使用。MDL的作用是确保读写操作的正确性。

  • 读写锁机制:在对表进行增删改查操作时,会加MDL读锁;在对表进行结构变更操作时,会加MDL写锁。读锁之间不互斥,但写锁之间是互斥的,确保了结构变更操作的安全性。
  • 事务提交机制:MDL锁会在事务提交后自动释放。在进行表结构变更时,必须确保没有长时间锁定,否则会对线上查询和更新造成影响。

总结

全局锁和表级锁在MySQL 中各有优劣,适用于不同的场景。全局锁适合全库逻辑备份,但风险较高;表级锁则在具体业务场景中提供更细粒度的锁控制。理解和合理选择锁机制,是优化数据库性能和保证数据一致性的关键。

转载地址:http://gler.baihongyu.com/

你可能感兴趣的文章
C语言的运算符和表达式
查看>>
【模拟】优美三角剖分
查看>>
【普及模拟】交换
查看>>
4*4矩阵键盘的FPGA驱动
查看>>
椭圆曲线密码系统——椭圆曲线
查看>>
Vue实现选项卡功能
查看>>
清除默认样式
查看>>
数据结构——链表
查看>>
CommonJs
查看>>
ICMP网际控制报文协议
查看>>
[编程题]Course List for Student (25)
查看>>
【Python】面向对象2:之抽象基类:import abc,metaclass=abc.ABCMeta
查看>>
【Python】面向对象,封装
查看>>
接口又是个啥?
查看>>
5.11 TEST1
查看>>
uni-app请求头中携带token
查看>>
常用的 Git 命令和小技巧(1)
查看>>
vue中接收后台的图片验证码并显示
查看>>
springboot入门(1)---整合MyBatis
查看>>
Vue入门学习笔记(1)
查看>>