当前位置: 首页 > news >正文

网站 只收录首页梧州网站建设有哪些

网站 只收录首页,梧州网站建设有哪些,一键生成logo免费网站,唐山网站制作网络公司今天我要跟你聊聊MySQL的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源#xff0c;当出现并发访问的时候#xff0c;数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围#xff0c;MySQL里面的锁大致可以分成…今天我要跟你聊聊MySQL的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源当出现并发访问的时候数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章我会和你分享全局锁和表级锁。而关于行锁的内容我会留着在下一篇文章中再和你详细介绍。 这里需要说明的是锁的设计比较复杂这两篇文章不会涉及锁的具体实现细节主要介绍的是碰到锁时的现象和其背后的原理。 全局锁 顾名思义全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候可以使用这个命令之后其他线程的以下语句会被阻塞数据更新语句数据的增删改、数据定义语句包括建表、修改表结构等和更新类事务的提交语句。 全局锁的典型使用场景是做全库逻辑备份。也就是把整库每个表都select出来存成文本。 以前有一种做法是通过FTWRL确保不会有其他线程对数据库做更新然后对整个库做备份。注意在备份过程中整个库完全处于只读状态。 但是让整库都只读听上去就很危险 如果你在主库上备份那么在备份期间都不能执行更新业务基本上就得停摆 如果你在从库上备份那么备份期间从库不能执行主库同步过来的binlog会导致主从延迟。 看来加全局锁不太好。但是细想一下备份为什么要加锁呢我们来看一下不加锁会有什么问题。 假设你现在要维护“极客时间”的购买系统关注的是用户账户余额表和用户课程表。 现在发起一个逻辑备份。假设备份期间有一个用户他购买了一门课程业务逻辑里就要扣掉他的余额然后往已购课程里面加上一门课。 如果时间顺序上是先备份账户余额表(u_account)然后用户购买然后备份用户课程表(u_course)会怎么样呢你可以看一下这个图 图1 业务和备份状态图 可以看到这个备份结果里用户A的数据状态是“账户余额没扣但是用户课程表里面已经多了一门课”。如果后面用这个备份来恢复数据的话用户A就发现自己赚了。 作为用户可别觉得这样可真好啊你可以试想一下如果备份表的顺序反过来先备份用户课程表再备份账户余额表又可能会出现什么结果 也就是说不加锁的话备份系统备份的得到的库不是一个逻辑时间点这个视图是逻辑不一致的。 说到视图你肯定想起来了我们在前面讲事务隔离的时候其实是有一个方法能够拿到一致性视图的对吧 是的就是在可重复读隔离级别下开启一个事务。 官方自带的逻辑备份工具是mysqldump。当mysqldump使用参数–single-transaction的时候导数据之前就会启动一个事务来确保拿到一致性视图。而由于MVCC的支持这个过程中数据是可以正常更新的。 你一定在疑惑有了这个功能为什么还需要FTWRL呢一致性读是好但前提是引擎要支持这个隔离级别。比如对于MyISAM这种不支持事务的引擎如果备份过程中有更新总是只能取到最新的数据那么就破坏了备份的一致性。这时我们就需要使用FTWRL命令了。 所以single-transaction方法只适用于所有的表使用事务引擎的库。如果有的表使用了不支持事务的引擎那么备份就只能通过FTWRL方法。这往往是DBA要求业务开发人员使用InnoDB替代MyISAM的原因之一。 你也许会问既然要全库只读为什么不使用set global readonlytrue的方式呢确实readonly方式也可以让全库进入只读状态但我还是会建议你用FTWRL方式主要有两个原因 一是在有些系统中readonly的值会被用来做其他逻辑比如用来判断一个库是主库还是备库。因此修改global变量的方式影响面更大我不建议你使用。 二是在异常处理机制上有差异。如果执行FTWRL命令之后由于客户端发生异常断开那么MySQL会自动释放这个全局锁整个库回到可以正常更新的状态。而将整个库设置为readonly之后如果客户端发生异常则数据库就会一直保持readonly状态这样会导致整个库长时间处于不可写状态风险较高。 业务的更新不只是增删改数据DML)还有可能是加字段等修改表结构的操作DDL。不论是哪种方法一个库被全局锁上以后你要对里面任何一个表做加字段操作都是会被锁住的。 但是即使没有被全局锁住加字段也不是就能一帆风顺的因为你还会碰到接下来我们要介绍的表级锁。 表级锁 MySQL里面表级别的锁有两种一种是表锁一种是元数据锁meta data lockMDL)。 表锁的语法是 lock tables … read/write。与FTWRL类似可以用unlock tables主动释放锁也可以在客户端断开的时候自动释放。需要注意lock tables语法除了会限制别的线程的读写外也限定了本线程接下来的操作对象。 举个例子, 如果在某个线程A中执行lock tables t1 read, t2 write; 这个语句则其他线程写t1、读写t2的语句都会被阻塞。同时线程A在执行unlock tables之前也只能执行读t1、读写t2的操作。连写t1都不允许自然也不能访问其他表。 在还没有出现更细粒度的锁的时候表锁是最常用的处理并发的方式。而对于InnoDB这种支持行锁的引擎一般不使用lock tables命令来控制并发毕竟锁住整个表的影响面还是太大。 另一类表级的锁是MDLmetadata lock)。MDL不需要显式使用在访问一个表的时候会被自动加上。MDL的作用是保证读写的正确性。你可以想象一下如果一个查询正在遍历一个表中的数据而执行期间另一个线程对这个表结构做变更删了一列那么查询线程拿到的结果跟表结构对不上肯定是不行的。 因此在MySQL 5.5版本中引入了MDL当对一个表做增删改查操作的时候加MDL读锁当要对表做结构变更操作的时候加MDL写锁。 读锁之间不互斥因此你可以有多个线程同时对一张表增删改查。 读写锁之间、写锁之间是互斥的用来保证变更表结构操作的安全性。因此如果有两个线程要同时给一个表加字段其中一个要等另一个执行完才能开始执行。 虽然MDL锁是系统默认会加的但却是你不能忽略的一个机制。比如下面这个例子我经常看到有人掉到这个坑里给一个小表加个字段导致整个库挂了。 你肯定知道给一个表加字段或者修改字段或者加索引需要扫描全表的数据。在对大表操作的时候你肯定会特别小心以免对线上服务造成影响。而实际上即使是小表操作不慎也会出问题。我们来看一下下面的操作序列假设表t是一个小表。 备注这里的实验环境是MySQL 5.6。 我们可以看到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写锁最好拿不到也不要阻塞后面的业务语句先放弃。之后开发人员或者DBA再通过重试命令重复这个过程。 MariaDB已经合并了AliSQL的这个功能所以这两个开源分支目前都支持DDL NOWAIT/WAIT n这个语法。 ALTER TABLE tbl_name NOWAIT add column ... ALTER TABLE tbl_name WAIT N add column ... 小结 今天我跟你介绍了MySQL的全局锁和表级锁。 全局锁主要用在逻辑备份过程中。对于全部是InnoDB引擎的库我建议你选择使用–single-transaction参数对应用会更友好。 表锁一般是在数据库引擎不支持行锁的时候才会被用到的。如果你发现你的应用程序里有lock tables这样的语句你需要追查一下比较可能的情况是 要么是你的系统现在还在用MyISAM这类不支持事务的引擎那要安排升级换引擎 要么是你的引擎升级了但是代码还没升级。我见过这样的情况最后业务开发就是把lock tables 和 unlock tables 改成 begin 和 commit问题就解决了。 MDL会直到事务提交才释放在做表结构变更的时候你一定要小心不要导致锁住线上查询和更新。
http://www.zqtcl.cn/news/33056/

相关文章:

  • 汇鑫科技网站建设重庆建工
  • 公司建多个网站php企业网站cms
  • 营销网站的渠道构成基本包括卖东西怎么推广
  • 百中搜如何做网站排名建设门户网站的基本意义有哪些
  • dz网站后台精准大数据获客系统
  • 返利网站开发网站制作方案中哪几个点比较重要
  • 网站建设毕业设计总结网络优化策划书
  • 建网站和做微信哪个好同时优化几个网站
  • 化工企业网站模板wordpress 浏览计数
  • 装修公司网站wordpress 模板php做在线直播网站
  • 网站域名找回密码 用户名株洲网
  • 景安 怎么把网站做别名wordpress释放内存
  • 关键词搜索挖掘爱网站装修设计师培训班
  • 池州网站seo淘宝网站内站建设现状
  • 浦江县做网站搭建个官网需要多少钱
  • 合肥seo网站建设费用哪个公司的卡网络最好
  • wordpress 菜单保存在哪北京seo课程
  • 常见电子商务网站基本模式代加工厂都不做网站
  • 网站建设小说7k7k游戏网页版入口
  • 网站dns设置wordpress底部文件修改
  • 小区网站建设方案怎么写wordpress编辑器 下载地址
  • 网站开发视频是存储的什么软件可以免费制作图片
  • 金融网站模板 html下载万网网站加速
  • 黔西南州住房和城乡建设局网站建站语言
  • 做选择的网站宠物网站建设方案
  • 苏州网站建设苏州南通网站搜索引擎优化
  • 网站空间大小有什么用执念待重生wordpress
  • 网站建设图片大全网页美工设计教学
  • 网站被域名重定向网络架构方法
  • 可以做淘宝推广的网站吗如何做网站的充值功能