焦点快播: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
- 环球要闻:定投基金怎么买
- 看火车逛公园,成都人的别样周末_天天要闻
- 世界资讯:在中国怎么炒外汇?外汇交易方式有哪些?
- 蝉的幼虫挖洞刨出的浮土去了哪里_蝉的幼虫
- 当前热点-ERP系统一般有哪几种
- 实战:三星N7100获取root权限教程|世界动态
- 世界新消息丨华师附属信宜学校 将在9月开学了
- 天天快消息!亚马逊最新一轮涉及9000名员工的裁员正式开启
- 环球热点评!这样养护发财树,可以整个冬天枝繁叶绿
- 归化实锤!冬奥冠军刘少林、刘少昂兄弟加盟天津短道速滑队
- 电脑总是很卡是什么原因 全球热讯
- 茂业商业:2022年实现营业收入34.09亿元|环球新视野
- 广汽丰田全新换代雷凌为电混轿车市场树立新标杆 环球快讯
- 2023安徽安庆市考试录用公务员笔试合格分数线和达线人员成绩公告-全球观点
- 隐姓埋名60余载!感动中国时,他已年近九旬_今日报
- Maruti的新CNG汽车会让人们等待很长时间这就是等待期
- 中国古代四大美人介绍 全球热推荐
- 环球观热点:筠连县医疗保障局:依托12345热线助力医保暖心服务
- 原神同人之坎蒂丝x迪希雅
- 热文:司机“开门杀”致人死亡被判刑不冤枉
- 有报告显示英军在空袭伊拉克和叙利亚时造成至少26名平民死亡 每日视点
- 又因未及时披露诉讼事项收到监管函 越博动力专职董秘已空缺273天|快资讯
- 大秦帝国第二部剧情介绍
- 南方中证申万有色金属ETF净值上涨1.01% 请保持关注
- 爱护花草的标语有_爱护花草的标语简短_世界热资讯
- 快讯2023-03-23 23:00:51
- 今热点:三国志战略版才俊枪环境大好,两波天下无双,太舒服!
- 盒马:今年将扩大在沪投资新开20家盒马鲜生门店|今日热闻
- 腊月二十三的习俗是什么
- 支付宝投诉诈骗能退钱吗?如何追回?_全球热点
- 全球新动态:2023北京石油化工学院考研分数线
- 热头条丨盛迪
- 海南省民政厅召开全省“护苗”专项行动“社会防护”行动小组动员部署会暨第二次调度会
- 今日要闻!本周末开始 北京海淀部分道路临时管控
- 世界信息:四川一高校放假7天鼓励恋爱!网友:建议推广
- 环球要闻:古代小斯是什么意思
- 重磅!2023QS世界大学学科排名发布!MIT哈佛实力碾压,冲进前10的中国大学是....-全球热讯
- 中小VC艰难求生 数万亿“僵尸基金”进退两难
- (国际)中俄媒体圆桌会在俄罗斯举行 天天百事通
- 如何挑选好的燃气热水器_燃气热水器的挑选方法
- 什么是建筑基底面积?什么是建筑面积(什么是建筑基底面积)
- 2021-2022东北三省供暖时间几月到几月-天天资讯
- 权威发布 | 三方面有序推进!淄博着力打造“单项冠军之城”
- 每日短讯:市缘善汇助学中心:结对帮扶56名困难家庭学子
- 华文行楷字库,华文行楷下装安装 今日播报
- 怎么盘头发好看_如何盘头发好看
- 观众预登记 | 第23届立嘉国际智能装备展览会,5月26-29日重庆见!
- 约10亿美元没了!沙特国家银行在瑞信的投资损失惨重
- 和讯个股快报:2023年03月22日 指南针(300803),该股K线呈现“乌云盖顶”形态
- 天天播报:韩产业部长:日本将于本周解除对韩出口半导体材料限制措施
- 热资讯!男生亲女生
- WTI 11月原油期货收涨4.65%
- 《泰坦尼克号》又双叒要上映了-焦点热闻
- 全球快资讯:茱莉蔻花卉水喷雾怎么样?干燥时一定要喷一喷!
- 安托万·热拉尔 全球新资讯
- 中工国际:目前公司海外业务在手合同充足,公司在跟踪项目储备较多|看热讯
- 罪恶王冠女主为什么进男二房间_罪恶王冠女主 世界新要闻
- 当前关注:手绘汉服女子简笔画_汉服简笔画图片大全
- 天天微速讯:如春赋新 二环天坛府重构内城生活想象力
- 美联储慌了!又开始紧急启动印钞机 天天聚看点
- 湖北省教育信息网学历查询证明怎么打印_湖北省教育信息网学历查询证明
- 当日快讯:未按约定及时 足额归集基础资产资金并将相关资金挪为他用,龙元建设收宁波证监局警示函-每日热文
- 头皮屑多用什么洗发水_环球关注
- 吉林检察机关依法对路军涉嫌受贿、挪用公款、国有公司人员滥用职权案提起公诉
- 滨州中等职业技术学校_滨州职业技术学院官网
- 德善实业有限公司 天天快播
- 实时焦点:华特达因董秘回复:达因药业始终坚持战略目标不动摇,坚持量身定制儿童药物研发理念
- 广东宏大3月20日盘中跌幅达5%
- 济南市青少年光电射击混合团体锦标赛成功举办|环球微头条
- 广汽埃安7kW智能家充桩发布,售价4999元 全球即时看
- 滚动:中秋的作文_中秋之夜作文
- 天弘兴享一年定开基金3月22日分红
- 防水手机有哪几款_什么手机防水_世界今日报
- CF:问题来了,挑战42把“巨人起源”就不能得到激光毁灭者?
- 漫灭近义词是什么意思_漫灭近义词 全球即时
- 环球信息:be going to句型结构_be going to
- 全区首个,揭牌成立! 世界快看
- 世界快消息!x战警1完整在线观看
- 精选!描写山的词语(描写山的词语)
- 全球滚动:墨超:射正就有!洛萨诺任意球梅开二度 阿特拉斯4球大胜普埃布拉
- 双足副舟骨是什么意思_足副舟骨怎么治疗 每日观点
- 资讯推荐:网宿科技(300017):第五届第三十次监事会会议决议,审议关于新加坡子公司变更记账本位币的议案等议案
- A股险企首份年报出炉!万亿巨头3年改革成效显现 天天看点
- 女性大腿内侧痒是什么原因_大腿内侧痒是什么原因 速读
- 新车要不要急着上牌?
- 楼市会再次走热吗?短时间内不会!!|全球今亮点
- 环球动态:和讯个股快报:2023年03月17日 维康药业(300878)该股换手率大于5%
- 每日头条!哥组词_胳组词
- “劳动+”校本课程放大育人效应_即时看
- 类似的爱情2只有我知资源_类似爱情2只有我知未删减版|当前消息
- 焦点快报!惊心食人族 1_惊心食人族1
- 洛天依第二次来腾讯TAI支持福特领S触电
- 热资讯!Mysteel解读:连续两天快速回调,热卷总体身不由己
- 焦点快报!总市值57亿拟投资60亿向锂电材料!天力锂能收关注函
- 国投瑞银境煊混合A:成立7年收益率234.44%|天天时快讯
- 盘点湊湊火锅商业版图 湊湊火锅及母公司呷哺呷哺曾多次被罚_世界观热点
- 世界实时:慷慨的提供资源是哪个的_慷慨
- 张彦溱:3.16今日黄金走势分析,避险乱象蔓延,今日冲高跑步空!-世界实时
- 璠玙怎么读_璠怎么读
X 关闭
行业规章
X 关闭