范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一文带你看通透,MySQL事务ACID四大特性实现原理

  #头条创作挑战赛#
  hello,大家好,我是张张,「架构精进之路」公号作者。
  说起MySQL事务处理的四大特性,相信大家都可以张口就来:ACID!
  那 MySQL是如何实现ACID的?每种特性的原理又是如何实现的?
  今天,本文笔者主要探讨MYSQL InnoDB引擎下的ACID实现原理,对事务、锁以及隔离级别等内容统一进行回顾一下。
  1、ACID特性原子性(Atomicity)
  单个事务,为一个不可分割的最小工作单元,整个事务中的所有操作要么全部commit成功,要么全部失败rollback,对于一个事务来说,不可能只执行其中的一部分SQL操作,这就是事务的原子性。 一致性(Consistency)
  数据库总是从一个一致性的状态转换到另外一个一致性的状态。在前面的例子中, 一致性确保了,即使在执行第三、四条语句之间时系统崩溃,信用卡账户也不会损 失100块,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中,保证数据一致性。 隔离性(Isolation)
  通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见(隔离)的。避免多个事务并发执行的时候不会互相干扰。 持久性(Durability)
  一旦事务提交,则其所做的修改就会永久保存到数据库中,之后的其他操作或故障都不会对事务的结果产生影响。
  2、ACID 具体实现原子性:通过undolog来实现。 持久性:通过 binlog、redolog 来实现。 隔离性:通过(读写锁+MVCC)来实现。 一致性:MySQL通过原子性、持久性、隔离性最终实现数据一致性。
  对MySQL来说,逻辑备份日志(binlog)、重做日志(redolog)、回滚日志(undolog)、锁技术 + MVCC就是MySQL实现事务的基础。 2.1 原子性原理
  事务通常是以BEGIN TRANSACTION 开始,以 COMMIT 或 ROLLBACK 结束。 COMMIT 表示提交,即提交事务的所有操作并持久化到数据库中。 ROLLBACK表示回滚,即在事务中运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库所有已完成的操作全部撤销,回滚到事务开始时的状态,这里的操作指对数据库的更新操作(查询操作忽略)。这时候需要用到 undolog 来进行回滚。
  undolog:
  每条数据变更(INSERT/UPDATE/DELETE/REPLACE)等操作都会生成一条undolog记录,在SQL执行前先于数据持久化到磁盘。 insert语句,回滚时会执行 delete;
  delete语句,回滚时会执行insert;
  update语句,回滚时便执行相反的update,把数据改回来。
  当事务需要回滚时,MySQL会根据回滚日志对事务中已执行的SQL做逆向操作,比如 DELETE 一行数据的逆向操作就是再把这行数据 INSERT回去,其他操作同理。
  undolog记录事务开始前老版本数据,用于实现回滚,保证原子性,实现MVCC,会将数据修改前的旧版本保存在undolog,然后行记录有个隐藏字段回滚指针指向老版本。 2.2 持久性原理
  我们知道,MySQL表数据是持久化到磁盘中的,但如果所有操作都去操作磁盘,等并发上来了,那处理效率无法保证,因此引入了缓冲池(Buffer Pool)的概念,Buffer Pool 中包含了磁盘中部分数据页的映射,可以当做缓存来用;这样当修改表数据时,我们把操作记录先写到Buffer Pool中,并标记事务已完成,等MySQL空闲时,再把更新操作持久化到磁盘里,从而大大缓解了MySQL并发压力。
  MYSQL的持久性便是由redo log来保证。
  redo log
  是一种物理日志, 作用:会记录事务开启后对数据做的修改,crash-safe。 它类似于一个卸货的小推车,我们若是每卸一件物品就拿着去入库,那岂不是特浪费时间,若有一个小推车,我们将货物首先存放在小推车,当推车满了再往库里存,可以大大提升效率。
  其实就是MySQL里经常说到的WAL技术,WAL的全称是 Write-Ahead Logging ,它的关键点就是先写日志,再写磁盘,也就是先装小推车,等不忙的时候再装库。
  特性:空间一定,写完后会循环写  ,有两个指针write pos指向当前记录位置,checkpoint指向将擦除的位置,redolog相当于是个取货小车,货物太多时来不及一件一件入库太慢了这样,就先将货物放入小车,等到货物不多或则小车满了或则店里空闲时再将小车货物送到库房。用于crash-safe  ,数据库异常断电等情况可用redo log恢复。
  以下只作了解:
  写入流程:先写redo log buffer,然后wite到文件系统的page cache,此时并没有持久化,然后fsync持久化到磁盘
  写入策略:根据innodb_flush_log_at_trx_commit参数控制(innodb以事务的什么提交方式刷新日志) 0——>事务提交时只把redo log留在redo log buffer
  1——>将redo log直接持久化到磁盘(所以有个双"1"配置,后面会讲)
  2——>只是把redo log写到page cache
  2.3 隔离性原理
  MYSQL有四种隔离级别,用来解决存在的并发问题:脏读、幻读、不可重复读。
  那么不同隔离级别,隔离性是怎样实现的呢?
  一句话:锁+MVCC。
  锁表锁:读锁(不会阻塞其他线程的读操作,阻塞写操作);写锁(读写操作都阻塞) 行锁:需要的时候加上,并不是马上释放,等事务提交才释放,两阶段锁协议 锁的类型
  间隙锁-gap lock :锁定区间范围,防止幻读,左开右开,只在可重复读隔离级别下生效—|—为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生
  记录锁-record Lock :锁定行记录,索的索引,索引失效,为表锁
  临键锁-next-key Lock :record lock+gap lock 左开右闭 (解决幻读 )  锁的模式
  select .... for update (持有写锁,别的不可加读锁,也不可加写锁)
  select .... lock in share mode(持有读锁,别的可以再加读锁,不可加写锁)
  共享锁-读锁-S锁
  排他锁-写锁-X锁
  意向锁:读意向锁+写意向锁
  自增锁  全局锁:全库逻辑备份 死锁:两个或多个事务在同一资源上相互占用,并请求加锁时,造成相互等待,无限阻塞
  MVCC:实现多版本并发控制,实现原理:使用版本链+Read View
  读已提交和可重复读实现原理就是MVCC Read View不同的生成时机。可重复读只在事务开始时生成一个Read View,之后都用的这个;读已提交每次执行前都会生成Read View。
  2.4 一致性原理
  一致性是事务追求的最终目标,前文所述的原子性、持久性和隔离性,其实都是为了保证数据库状态的一致性,数据库中的增删改操作,使数据库不断从一个一致性的状态转移到另一个一致性的状态。
  总结
  事务该回滚的回滚,该提交的提交,提交后该持久化磁盘的持久化磁盘,该写缓冲池的写缓冲池+写日志。
  对于数据可见性,通过四种隔离级别进行控制,使得库表中的有效数据范围可控,保证业务数据的正确性的前提下,进而提高并发程度,支撑服务高QPS的稳定运行,保证数据的一致性,这就是咱们说个不停的MySQL数据库事务ACID四大特性。
  希望今天的讲解对大家有所帮助,谢谢!
  Thanks for reading!
  作者:架构精进之路,十年研发风雨路,大厂架构师,CSDN 博客专家,专注架构技术沉淀学习及分享,职业与认知升级,坚持分享接地气儿的干货文章,期待与你一起成长。
  关注并私信我回复"01",送你一份程序员成长进阶大礼包,欢迎勾搭。

高手过招招招致命,武侠游戏这些招式大有来头提到江湖,最吸引人眼球的莫过于那些千奇百怪的武功招式了,实际上这些听上去霸气威猛的招式套路往往有着相当深厚的背景渊源,像武林中人梦寐以求的易筋经就源于中国古代中医导引术,具有强健体传闻魔戒咕噜预计4月至9月发售据Nacon财报消息,魔幻RPG游戏魔戒咕噜预计会在今年4月至9月发售,游戏将登陆PCPS4PS5XboxOneXSXS和Switch平台。魔戒咕噜是一款以魔戒故事为题材的动作冒险DNF私服内部人员曝光行业内幕,发现这几点千万别玩!地下城与勇士作为一款经久不衰的老牌端游,已经走过了十多个年头,而由于游戏的更新迭代,很多玩家玩不明白国服后,纷纷投入到私服的怀抱当中。注意文章字数偏多,可以直接划到第三个问题的答案临时凑时长!岳云鹏孙越的相声被骂惨了,语言类节目无一幸免大家好,我是娱见娱乐圈!今年春晚唯一一个相声表演被岳云鹏和孙越演砸了!岳云鹏和孙越被怀疑就是来临时救场的,演出时长被无情压榨,不仅如此,语言类节目似乎都无一幸免岳云鹏孙越的相声被指银护跳槽DC遭大量粉丝反对!被指责烂俗,漫威演员糟糕透了不久前,滚导公开表示,希望银河护卫队未来可能和他一起跳槽来DC,在新宇宙中饰演新的角色。这个言论发布后,引发了互联网剧烈的反响,其中部分极端粉丝对银护演员去DC表达了强烈的反对。并英雄梯度排行射手已无T0,莱西奥起飞失败,没有达到预期射手在S30赛季的重要性不言而喻,没有射手的持续输出,在坦克较多的阵容中就容易出现伤害乏力的问题,那大家觉得当前版本的射手强度如何呢?下面我们一起来看看吧。英雄强度仅供参考!莱西奥FC游戏FC1943第6弹!FC游戏FC1943系列第6弹主角P38闪电战斗机敌方boss类型轰炸机编队英文TypeIVheavybomber日文汉文四式重型轰炸机历史概况机身长度18。7米翼展22。50米重长安幻想孙悟空的最佳打书方式hi!我是梦溪,你们知道在长安幻想中最强物理输出的妖灵是谁吗?小编觉得是那位以物理输出的孙悟空,不知道各位小伙伴们是不是怎么想的,不过这一期是和孙悟空有关的哦!具体是什么小编已经透部落冲突国服独立,全球同服成历史版本14。426。3(国服14。405。14)2022215一国服独立,全球同服成历史详见什么是216事件?这件事造成了什么影响呢?这次维护是2月15日晚上十点多开始的,当天晚上十美文欣赏丨欧阳斌张家界需要一百个流云文欧阳斌兔年大年初一,我正在长沙享受与家人团聚含饴弄孙的快乐,流云先生兴冲冲的从张家界打来电话,除了拜年,就是告诉我,他将于3月1日在长沙组织的张家界之春文化旅游融合发展促进会暨流习近平向拉美和加勒比国家共同体第七届峰会作视频致辞视频加载中1月24日,拉美和加勒比国家共同体第七届峰会在阿根廷首都布宜诺斯艾利斯举行。应拉共体轮值主席国阿根廷总统费尔南德斯邀请,国家主席习近平向峰会作视频致辞。习近平指出,拉美和
中国车企集体发力欧洲市场作者丨左茂轩编辑丨张明艳图源丨视觉中国当地时间10月17日,阔别四年之后,巴黎车展再次拉开帷幕。和过去几年绝大多数国际车展类似,电动汽车成为巴黎车展最重要的元素,奔驰雷诺等欧洲车企0分0板0助0帽!辽宁队赢球之夜,他却显得有点落寞CBA常规赛第二轮,迎来了一场焦点比赛,北京队对阵卫冕冠军辽宁队,随着雷蒙最后时候上篮被帽,最终,辽宁队以8381赢了北京队2分,从而拿到了CBA开赛以来的2连胜,继续保持着不败的CBA综合消息四川不敌龙狮山西险胜青岛新华社北京10月14日电(记者吴博文曹奕博)20222023赛季中国男子篮球职业联赛(CBA)常规赛第二轮比赛14日继续进行,四川队以98106不敌龙狮队,山西队以103102险胜下水道堵了,别用热水冲!教你一招,轻松疏通不求人我们在生活中肯定会遇到管道堵塞问题,要是没有及时解决,还会滋生异味和细菌,尤其是卫生间和厨房,这两个地方经常会堵塞,我们一定要学会正确的方法才行。有的时候你明明很注意了,但马桶地漏让人相见恨晚的12件厨房好物,轻松提升生活幸福感,便宜又实用作为最常使用的地方,厨房里堆积着各种锅碗瓢盆瓶瓶罐罐,在没日没夜地使用之下,厨房似乎成了家里最脏乱的地方。厨房里的小物品如何收纳?黏腻腻的油污如何清理?厨房如何保持干净整洁?这些看周迅48岁生日依然如少女,卓越暗暗示爱,陈坤的表白则显出传奇传媒樱桃派系头条理娱君特约作者,看娱乐热点深度解读,认准理娱君!10月18日,周迅迎来48岁生日,工作室早早晒出其写真为其庆生,粉色与银色相间的眼影不仅时尚,还多了几分明媚。即便这英国首相承认在制定迷你预算时犯错并道歉当地时间10月17日晚,英国首相特拉斯在与部分保守党议员的会议中向参会议员道歉,表示其领导的政府在迷你预算的制定中犯了错误。特拉斯的新闻秘书向在场记者表示,特拉斯认为自己想做的太多撸起袖子加油干用新的伟大奋斗创造新的伟业本报讯(记者归欣马涛张笑闻)10月17日上午,习近平同志参加党的二十大广西代表团讨论,在河南团代表中引起热烈反响。大家纷纷表示,要把思想和行动统一到党的二十大精神上来,深入学习领会二十大时光市发改委建设现代化产业体系以实干实效推动项目建设提质提速习近平总书记在党的二十大报告中指出要建设现代化产业体系,坚持把发展经济的着力点放在实体经济上,加快建设制造强国。市发改委全体人员在聆听报告后表示,将切实把思想和行动统一到党的二十大今天全世界都在看的新闻2022。10。18伊朗外交部发言人称赞中国成就,期待与中国更多互动中共二十大在北京开幕,中共中央总书记习近平向大会作出报告,这也引起海外的广泛关注。伊朗外交部发言人卡纳尼17日在外交部新闻发布会上说郭艾伦发文道歉无条件接受CBA公司处罚深刻反思自身存在的问题北京时间10月18日,CBA官方今日对辽宁男篮球员郭艾伦违纪行为予以处罚,停赛6场罚款10万元。在今日辽篮和广州的比赛结束之后,郭艾伦在社媒发文表示无条件虚心接受处罚,并向所有人道