全局锁:

对整个数据库实例加锁。

  • MySQL提供加全局读锁的方法:Flush tables with read lock(FTWRL) 这个命令可以使整个库处于只读状态。使用该命令之后,数据更新语句、数据定义语句和更新类事务的提交语句等操作都会被阻塞。
  • 使用场景:全库逻辑备份。
  • 风险:
  • 如果在主库备份,在备份期间不能更新,业务停摆
  • 如果在从库备份,备份期间不能执行主库同步的binlog,导致主从延迟

官方自带的逻辑备份工具mysqldump,当mysqldump使用参数--single-transaction的时候,会启动一个事务,确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。

一致性读是好,但是前提是引擎要支持这个隔离级别。比如,对于MyISAM这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用FTWRL命令了。 所以,single-transaction方法只适用于所有的表使用事务引擎的库。如果有的表使用了不支持事务的引擎,那么备份就只能通过FTWRL方法。这往往是DBA要求业务开发人员使用InnoDB替代MyISAM的原因之一。 * 如果要全库只读,为什么不使用set global readonly=true的方式? 1. 在有些系统中,readonly的值会被用来做其他逻辑,比如判断主备库。所以修改global变量的方式影响太大,不建议使用。 2. 在异常处理机制上有差异。如果执行FTWRL命令之后由于客户端发生异常断开,那么MySQL会自动释放这个全局锁,整个库回到可以正常更新的状态。而将整个库设置为readonly之后,如果客户端发生异常,则数据库就会一直保持readonly状态,这样会导致整个库长时间处于不可写状态,风险较高。

表级锁

MySQL里面表级锁有两种,一种是表锁,一种是元数据所(meta data lock,MDL)

表锁的语法是:lock tables ... read/write,可以用unlock tables主动释放锁,也可以在客户端断开的时候自动释放。lock tables语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。 对于InnoDB这种支持行锁的引擎,一般不使用lock tables命令来控制并发,毕竟锁住整个表的影响面还是太大。

在MySQL 5.5版本中引入了MDL,当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁。MDL锁是系统默认会加的 读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。 读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行。

我们可以看到session A先启动,这时候会对表t加一个MDL读锁。由于session B需要的也是MDL读锁,因此可以正常执行。 之后session C会被blocked,是因为session A的MDL读锁还没有释放,而session C需要MDL写锁,因此只能被阻塞。 如果只有session C自己被阻塞还没什么关系,但是之后所有要在表t上新申请MDL读锁的请求也会被session C阻塞。前面我们说了,所有对表的增删改查操作都需要先申请MDL读锁,就都被锁住,等于这个表现在完全不可读写了。

如果某个表上的查询语句频繁,而且客户端有重试机制,也就是说超时后会再起一个新session再请求的话,这个库的线程很快就会爆满。

事务中的MDL锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。所以在做表结构变更的时候,一定要小心不要导致锁住线上查询和更新。

那么,如何安全地给小表加字段?

首先要解决长事务,事务不提交,就会一直占着MDL锁。在MySQL的information_schema 库的 innodb_trx 表中,可以查到当前执行中的事务。如果要做DDL变更的表刚好有长事务在执行,要考虑先暂停DDL,或者kill掉这个长事务。

而如果要变更的表是一个热点表,虽然数据量不大,但是上面的请求很频繁,此时不得不加个字段,该怎么做呢?

这时候kill可能未必管用,因为新的请求马上就来了。比较理想的机制是,在alter table语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到MDL写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后再通过重试命令重复这个过程。

mysql 写锁需要等待读锁释放吗_Mysql实战45讲笔记:5、全局锁和表锁相关推荐

  1. 怎么把mysql表里的时间往后推移_Mysql实战45讲笔记:2、更新语句的执行以及日志...

    mysql> update T set c=c+1 where ID=2; 执行语句前要先连接数据库,这是连接器的工作. 前面我们说过,在一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以 ...

  2. mysql 更新时间加数字_Mysql实战45讲笔记:8、聚合函数count

    count(*)的实现方式 在不同的MySQL引擎中,count()有不同的实现方式 1. MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count()的时候会直接返回这个数,效率很高: 2. ...

  3. MySQL 实战45讲--笔记

    文章目录 MySQL 实战45讲-->笔记 开篇词 基础篇(8讲) 01 | 基础架构:一条SQL查询语句是如何执行的? 1.1 SQL 语句在 MySQL 的各个功能模块中的执行过程. 依次看 ...

  4. mysql 不让读的锁_MySQL实战45讲阅读笔记-锁

    全局锁 全局锁会对整个数据数据库实例加锁,使用的命令是flush tables with read lock,使用这个命令后其他线程的DML(增删改)语句.DDL(修改.定义表结构)语句和事务提交语句 ...

  5. 丁奇mysql45讲百度云下载_MySQL实战45讲,丁奇带你搞懂MySQL【完结】

    开篇词.这一次,让我们一起来搞懂MySQL.mp3 开篇词.这一次,让我们一起来搞懂MySQL.pdf 01.基础架构:一条SQL查询语句是如何执行的?.mp3 01.基础架构:一条SQL查询语句是如 ...

  6. MySQL实战45讲笔记(三)

    第六讲:全局锁和表锁 根据加锁的范围,MySQL里面的锁大致可以分成全局锁.表级锁和行锁三类. 一.全局锁 全局锁就是对整个数据库实例加锁.MySQL提供了一个加全局读锁的方法,命令是 Flush t ...

  7. mysql 主键冲突 多个事务回滚_MySQL实战45讲Day38----自增主键不是连续的原因

    一.自增主键不连续的原因: 对于表: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL ...

  8. mysql执行动态说起来_MySQL实战45讲学习笔记:第十四讲

    一.引子 在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数.这时候你可能会想,一条 select count(*) from t 语句不就解决了吗? 但是,你会发现 ...

  9. mysql事务实战_MySQL实战45讲学习-事务相关笔记

    1.务的特性:原子性.一致性.隔离性.持久性 2.多事务同时执行的时候,可能会出现的问题:脏读.不可重复读.幻读 3.事务隔离级别:读未提交.读提交.可重复读.串行化 4.不同事务隔离级别的区别: 读 ...

最新文章

  1. d3设置line长度_使用d3画一些基本的图形
  2. 编译原理笔录(1)-编译程序基本构成
  3. CLR Via CSharp读书笔记(29) - 混合线程同步构造
  4. Java List.size()方法:返回列表中元素的个数(亲测)
  5. Storm入门(三)HelloWorld示例
  6. (转)淘淘商城系列——使用Jedis操作集群
  7. 你们的苹果手机,关闭哪些功能比较省电?
  8. Ajax提交json数据,通过jquery.cookie.js插件解决csrf_token问题
  9. matlAB gui 变成c,matlab改变GUI和figure左上角图标的方法,并生成exe文件
  10. Object.freeze( ) 阻止Vue无法实现 响应式系统
  11. java 微信 百度地图,android 百度地图gps转百度地图坐标java.lang.UnsatisfiedLinkError: CoordinateEncryptEx...
  12. matlab qpsk调制 函数,MATLAB_QPSK调制与解调
  13. 华为认证、华三认证、思科认证考哪个好?
  14. C#代码混淆加壳利器ConfuserEx的使用
  15. 没了Ghost,系统也能“雨过天晴”了
  16. libnet库的安装与使用
  17. 在emwin中显示字库芯片GT23L24M0140的字模
  18. 机载激光雷达原理与应用科普(二)
  19. 计算机的云是什么意思_云计算是什么意思?为什么叫云计算?
  20. w ndows10隐藏桌面设置,据说,这是80%的人都不知道的win10隐藏功能

热门文章

  1. AngularJs前端环境搭建
  2. [Runtime]-交换方法
  3. android app数据库数据存放
  4. AJAX实现页面选项卡、隔行换色、弹出层功能代码
  5. JingRiverOS的自由软件之路
  6. C语言4行7列星星,如何使用C++循环语句实现星号塔5行每行分别是1,3,5,7,9个星星?...
  7. 怎么往integer型数组添加数据_用户日活月活怎么统计 - Redis HyperLogLog 详解
  8. 绝对布局优势_遇上狭长型卫生间基本没救?2种布局教会你,什么叫美观实用兼具...
  9. 如何把opencv编译到matlab,c – 为OpenCV编译MATLAB绑定
  10. html给图片做绝对定位,有关绝对定位的全面理解