Mysql高可用高性能存储应用系列2 - 深入理解锁和Mvcc
概述
Mysql数据库在处理并发中下了很多功夫,锁是为了更好的保护数据的正确和可靠,Mvcc是维持一个数据的多个版本,使得读写操作没有冲突的解决并发的数据库方案。
锁
当数据访问多了,就会出现并发的问题,Mysql锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。
(资料图片仅供参考)
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。
全局锁
全局锁就是对整个数据库实例加锁,当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
全局锁命令:
//加锁Flush tables with read lock;//释放锁命令unlock tables;
全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。
mysql> UPDATE runoob_tbl SET runoob_title="学习 C++" WHERE runoob_id=1;2013 - Lost connection to server during querymysql> INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("学习 PHP", "菜鸟教程", NOW());2013 - Lost connection to server during querymysql> SELECT * FROM runoob_tbl;+-----------+--------------+---------------+-----------------+| runoob_id | runoob_title | runoob_author | submission_date |+-----------+--------------+---------------+-----------------+| 1 | Go 学习 | 菜鸟教程 | 2023-03-22 |+-----------+--------------+---------------+-----------------+1 row in set (0.01 sec)
释放全局锁后,所有的进程得到释放,需要注意的是如果是终端操作需要清空链接缓存,或者打开新链接重试,mysql释放锁在当前的链接中是不生效的。
mysql> use mysql2;Database changedmysql> INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("学习 PHP", "菜鸟教程", NOW());Query OK, 1 row affected (0.03 sec)
表级锁
MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。
表锁是最常用的处理并发的方式。而对于 InnoDB 这种支持行锁的引擎,一般不使用 lock tables 命令来控制并发,毕竟锁住整个表的影响面还是太大。
另一类表级的锁是 MDL(metadata lock)。
//加锁lock tables 表名 ... read/write;//释放锁unlock tables;
表级锁分读锁和写锁,1)读锁,在进行读锁时,读不会受到影响但是会阻塞其他进程的insert、update操作。
mysql> lock tables runoob_tbl read;Query OK, 0 rows affected (0.05 sec) mysql> select * from runoob_tbl;+-----------+--------------+---------------+-----------------+| runoob_id | runoob_title | runoob_author | submission_date |+-----------+--------------+---------------+-----------------+| 1 | 学习 C++ | 菜鸟教程 | 2023-03-22 || 2 | 学习 PHP | 菜鸟教程 | 2023-03-22 || 3 | 学习 PHP | 菜鸟教程 | 2023-03-22 |+-----------+--------------+---------------+-----------------+3 rows in set (0.02 sec)//写操作mysql> INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("学习 PHP", "菜鸟教程", NOW());2013 - Lost connection to server during querymysql> UPDATE runoob_tbl SET runoob_title="学习 C++" WHERE runoob_id=1;2013 - Lost connection to server during query
2)写锁,对指定表加了写锁,会阻塞右侧客户端的读和写。
mysql> lock tables runoob_tbl write;Query OK, 0 rows affected (0.02 sec)mysql> unlock tables;Query OK, 0 rows affected (0.03 sec)
行锁
MySQL 的行锁是在引擎层由各个引擎自己实现的,但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。
行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。
两阶段锁协议:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
每个新来的被堵住的线程,都要判断会不会由于自己的加入导致了死锁,这是一个时间复杂度是 O(n) 的操作,要耗费大量的 CPU 资源,应该在逻辑上进行优化。
Mvcc
因为加锁会影响效率,MVCC全称多版本并发控制(Multiversion concurrency control, MCC 或 MVCC),是数据库管理系统常用的一种并发控制,理念是维持一个数据的多个版本,使得读写操作没有冲突的解决并发的数据库方案。
当前读和快照读
Mvcc 把事务的执行语句分为当前读和快照读。
当前读:总是读取最新的版本的记录。快照读:读取历史版本的记录,历史版本保存在undo Log(回滚日志)中,快照读就是MySQL为我们实现MVCC理想模型的其中一个具体非阻塞读功能。//select * from Table //快照读//Insert Update Delete //当前读//Select ... lock in share mode //当前读//Select ... for update //当前读
事务的隔离解决有四种,可重复读(RR)、读已提交(RC)、读未提交、序列化,查看全局隔离权限语句,旧版的myql使用tx开头,否则报错1193 - Unknown system variable "tx_isolation"
。
mysql> show variables like "transaction_isolation";+-----------------------+-----------------+| Variable_name | Value |+-----------------------+-----------------+| transaction_isolation | REPEATABLE-READ |+-----------------------+-----------------+1 row in set (0.07 sec)mysql> select @@transaction_isolation;+-------------------------+| @@transaction_isolation |+-------------------------+| REPEATABLE-READ |+-------------------------+
如果没有设置隔离级别,可使用下面语句进行设置。
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;Query OK, 0 rows affected (0.03 sec)
MVCC的实现原理
MVCC的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo日志 ,Read View 来实现的。
每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段。
DB_TRX_ID : 创建或最后修改记录的事务IDDB_ROW_ID : 隐藏主键DB_ROLL_PTR :Undo Log里的回滚指针,7byte大小read-view:事务在快照时产生的读视图。
trx_list : 系统活跃的事务IDup_limit_id : 列表中事务最小的IDlow_limit_id : 系统尚未分配的下一个事务IDMvcc判断的规则:
1.比较DB_TRX_ID和up_limit_id,如果小于,则当前事务能看到DB_TRX_ID的记录,如果大于和等于,则进入下一个判断
2.比较DB_TRX_ID和low_limit_id,如果大于等于则代表DB_TRX_ID的记录在read-view生成后出现的,那么对于当前事务不可见。如果小于,则进入下一个判断。
3.判断DB_TRX_ID是否在活跃事务中,如果在,代表read-view生成时,事务还在活跃状态,修改的数据当前的事务是看不到的,如果不在,说明事务在read-view之前就commit了,那么修改的结果就是可见的。
可重复读(repeatable read):每次进行快照读时都生成读视图。
读已提交(read committed):只有第一次时生成读视图,之后没次都使用第一次时的读视图。
Mysql ( Innodb引擎 ) 保证数据的一致性
1.执行更新语句update table set a= 1 where id = 2
2.将id=2
的行上的列值改为1
3.将修改更新到内存中
4.记录在第N个Page的地方做修改,并将这行记录状态为prepare
5.修改好了,可以提交事务了
6.写入binlog
7.commit,提交事务
8.将redo log里这个事务的相关记录状态置为commit状态
这个数据提交过程,就是两阶段提交,在恢复数据时,用binlog和redolog两部分来比较做数据恢复就可以了。
事务
事务的特性:
原子性:UndoLog 隔离性:Mvcc持久性:RedoLog一致性:以上3个共同保证了一致性问题
1.既然有了redolog,为什么还要有binlog呢?
redolog依赖于搜索引擎层,并不是每一个引擎都有redolog,binlog是属于MysqlServer层。
标签:
推荐
- Mysql高可用高性能存储应用系列2 - 深入理解锁和Mvcc
- 广州至湖北神农架直飞航班复航 全球关注
- 龙龙高铁开始铺轨
- 大宗交易:巨星科技成交5923.35万元,成交价19.37元(03-24)-每日消息
- 全球新资讯:伽菲珈而的原名是什么
- 全球看点:衰!国足近2年战绩:19场6胜5平8负,胜率仅31%
- 有关竞争的名人名言_有关竞争的名言 俗语
- 当前速看:2014cad没有菜单栏(2014cad菜单栏不见了怎么显示出来)
- 2020立秋是哪天
- 儿童保温杯怎样算保温?
- 你已走在悬崖边!跨境老板必看,税务合规可以有模板
- 【“三抓三促”行动进行时】23条意见建议!张掖公安恳谈知“媒”意|全球速读
- 舒活的意思是什么《春》一文中的_舒活的意思是什么
- 观天下!电视剧里有李洪海的是什么电视剧
- 每日快看:中国诗词第二季武亦姝_中国诗词大会第二季武亦姝第几期
- 全总表彰全国先进女职工集体和个人
- 每日焦点!外媒:美空袭叙东部以报复驻叙美军遭袭,拜登对伊朗发出警告
- 全球视讯!降龙祖师演员表介绍
- 飞车怎么拉车头视频教学_飞车怎么拉车头_天天实时
- 梦想的作用七年级(梦想的作用)
- 嘉亨家化(300955):关于合计持股5%以上股东减持股份达到1%暨减持数量过半的进展公告-今日观点
- 环球今头条!GNSS高精度定位服务产品提供商,六分科技入驻南京江北新区
- 魔兽世界飞行坐骑获取方法-今日关注
- 世界快报:2023年3月24日《合肥新闻联播》整档
- 环球看点!3月24日泓德睿泽混合净值上涨0.08%
- 当年轻人买走了6成高端护肤品 当前快看
- 海底捞回应孕妇可以插队 海底捞曾因“抠门”上热搜!_世界微资讯
- 中国电影(600977)3月24日主力资金净卖出2766.57万元-当前快讯
- scrolllock键是什么意思电脑
- 外媒:美军基地遭无人机袭击后,美国防部下令空袭报复
- 2023国际足球友谊赛:中国男足0-0新西兰 世界速递
- 三大通讯运营商均跌超5%-世界百事通
- 公司开除员工赔偿标准怎么赔_公司开除员工赔偿标准
- 年生产能力35亿双!辽源“袜业金名片”越擦越亮
- 宇通客车:3月23日融资买入1058.46万元,融资融券余额3.03亿元
- 怎么去设置微信拍一拍|世界微速讯
- 榆林窟研究论文集
- 360怎么设置网页主页_怎么设置网页为主页
- 全球速讯:预售32.29万起/续航730公里 岚图追光4月上市
- 在这里,翻开5000年茶文化大事记丨问道川茶——品味川茶文化⑤世界茶文化博物馆 观焦点
- 2023我国软包装市场规模 软包装的发展趋势调研
- 如何评价花木兰 天天快播
- 反向代购加速港深融合 香港品牌狮球唛深圳走红-焦点要闻
- 鸡鸣寺游客爆满设反悔门引导离寺是什么情况 鸡鸣寺游客爆满设反悔门引导离寺具体来龙去脉是怎么样 焦点快看
- 火龙果“追光者”:左手为果实掌灯 右手借力拼多多卖出
- 稳稳赚到8.88%,我的「搞钱」新思路-世界滚动
- 当前时讯:五经指的是什么书_四书是哪四书
- 速读:极地大乱斗怎么喂魄罗
- 电视广播与优酷合作,公司股价反弹逾11%,此前自高点股价腰斩 天天微资讯
- ST凯撒收关注函-焦点热门
- 艾滋病什么时候出现淋巴结肿大_艾滋病什么时候出现淋巴结肿大
- 聚焦:3月22日基金净值:国泰聚信价值优势混合A最新净值2.487,涨0.81%
- 环球今热点:成都市儿童福利院有健康的孩子吗_成都市儿童福利院
- 当前短讯!广州大学哪些专业比较好
- 橡胶产地及来源_橡胶产地_动态
- 全球看热讯:好消息!宁夏20个村入选第六批中国传统村落名录 中卫市1村入选
- 张悦抖音事件,寻找抖音上出现过的一个小故事
- 德国教育学概观
- 1元纸币图片_一元钱图片
- 世界观焦点:智能制造在长沙①|大族激光:与光同行 精工制造赋能产业升级
- 环球即时:故宫和紫禁城的区别在哪里_故宫和紫禁城的区别
- 多部门:做好2023年享受税收优惠政策的集成电路企业或项目、软件企业清单制定工作
- 环球通讯!扛旗!24岁姆巴佩担任法国队新队长 格刀出任副队
- 英语作文信件范文_英语作文信件模板|当前看点
- 当前焦点!怎么查找一个视频的出处_如何查找视频出处
- 环球信息:ColorOS 13.1 发布 多项行业首发技术 告别安卓卡顿“黑历史”
- 【环球热闻】对话卢克文杨现领|楼市开年“狂飙”?23年还将出现哪些新趋势?
- 佳能打印机售后网点查询_佳能打印机售后服务电话是多少_世界滚动
- 都是嘴馋惹的祸!女子盗窃熟食店10余斤牛腱子 环球播资讯
- 第49届东莞名家具展精彩落幕 四大行业趋势不容忽视
- 天天快看:Samtec 连接器小课堂 | 测试绝非事后补救
- 英甲提醒:谢周三上轮战平无缘连胜 连续13场有进球 世界快消息
- 科蓝软件(300663):3月20日北向资金减持3.24万股-天天视点
- 张兰的俏江南已成往事,但9.8亿旧账仍未了-世界独家
- 环球热点!传播文化业行业:动画龙头加码AI电影等PGC望迎重塑
- 高淳古柏:多措并举普知识 增强意识防风险
- 林木陈_关于林木陈简述
- 【聚看点】pld是什么化疗药物_pld
- 《重紫》重情重义 拒绝“傻白甜”-环球快讯
- 每日热点:研究称男性也有最佳生育年龄 在25~35周岁之间
- 山北县委县政府旧址
- 世界今日报丨降水量毫米是什么意思百度百科_降水量毫米是什么意思
- 奥迪这回完全摸不着边际!A6L见了头痛不已,降价9万或遭疯抢
- 哈维-阿隆索执教勒沃库森16场拿29分,同期积分德甲第四多-微速讯
- 全球通讯!美容院减肥有效果吗_美容减肥的方法
- 黄金彩虹1080p下截_黄金彩虹18
- 羟苯磺酸钙分散片的功效与副作用_羟苯磺酸钙分散片主要治什么病
- Toro的机器人割草机使用多个摄像头在院子里导航_全球时快讯
- 环球播报:张宁35分生涯新高林葳14分 山西客场送同曦3连败
- 红包怎么写名字_红包怎么写
- 焦点速递!抢先静态体验腾势N7
- 天天速读:第1章血债血偿(第1章 血脉重生)
- 西安国际港务区新筑街道就业培训服务中心揭牌 环球速看料
- 欧亨利麦琪的礼物图片_欧亨利麦琪的礼物
- 全球速读:西宁特钢(600117):九届六次董事会会议决议,审议《关于全资子公司为控股股东提供担保的议案》等议案
- 海南海药: 关于注射用头孢他啶通过仿制药质量和疗效一致性评价的公告
- 环球看热讯:北京城乡:2022年归母净利润为-2.2亿元,连续三年亏损
- 东兴公路口岸进境粮食指定监管场地获批运营 全球实时
- 一年级认识钱币练习题_一年级认识人民币练习题
- 2023兴山县昭君故里路线推荐
X 关闭
行业规章
X 关闭