全局锁和表锁

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。全局锁和表锁,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

锁的出现

1. 数据库锁设计的初衷是解决并发问题
2. 作为多用户共享的资源,当出现并发访问时,数据库需要合理的控制资源的访问规则,而锁就是用来实现这些访问规则的重要数据结构

锁的分类

1. 全局锁(解决全库逻辑备份问题)
2. 表级锁
3. 行锁

全局锁

就是对整个数据库实例加锁

加全局读锁的语句:

flush tables with read lock

当你需要让整个库都处于只读状态时,可以使用这个命令,之后其他线程的以下语句会被阻塞:

  • 数据更新语句(数据的增删改)
  • 数据定义语句(包括建表,修改表结构)
  • 更新类事务的提交语句

全局锁的使用场景:做全库逻辑备份,也就是把整个库都Select出来存成文本

  • 如果不做全局备份的话,备份系统备份得到的库不是一个逻辑时间点,这个视图是逻辑不一致的

做全库逻辑备份不同全局锁,用mysqldump

mysqldump是官方自带的逻辑备份工具,利用mvcc和可重复读,保证在备份过程中可以进行正常的数据更新
mysqldump -single-transaction

原理

  • 导数据之前会启动一个事务(可重复读隔离级别),来确保拿到一致性视图

缺点:

  • 不支持事务隔离级别的引擎无法实现,只能加全局锁进行备份

另一种设置全库只读的方式

使用语句:

set readonly = true

缺点:

  • 有些系统readOnly的值会做其他的判断逻辑,比如用来判断一个库是主库还是从库,因此,修改gloable影响面更大,不建议使用
  • 异常处理机制不一样,如果客户端连接因为异常断开,加全局锁的话会自动释放锁,设置全库只读的话会使整个库一直处于只读状态

表级锁

mysql里面表级锁有两种:
1: 表锁
2: 元数据锁

表锁

语法:

lock tables ... read/write
可以使用unlock tables主动释放锁
也可以在客户连接时主动释放:
注意:lock tables除了会限制别的线程的读写外,也限定了本线程接下来的操作对象

如果线程A执行了lock tables t1 read,则在释放锁之前,自己只能对表t进行读操作

MDL(metadata lock)

mdl不需要显示的使用,在访问一个表的时候会自动的被加上mdl

MDL的作用是保证读写的正确性:当对一个表做增删改查操作时,加MDL读锁,当要做表结构变更时,加MDL写锁

  • 读锁之间不互斥,可以有多个线程同时对一张表做增删改查
  • 读写锁之间,写锁之间是互斥的
    事务中的MDL锁,在语句执行时开始申请,但是语句结束后不会马上释放,而会等到整个事务提交后释放
    因此要进行表结构变更时,一定要先Kill掉长事务

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202558.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!