ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

事务的ACID以及MySQL是如何实现ACID的

2022-04-06 00:00:24  阅读:159  来源: 互联网

标签:事务 log MySQL 一致性 ACID redo 隔离


ACID

  • 原子性:一个事务内所有操作要么都成功,要么都失败
  • 持久性:一个事务完成之后数据会被完整保存下来,之后其他操作或故障都不会对该事务的结果产生影响
  • 隔离性:多个事务并发执行时不会互相干扰,一个事务内部数据对于其他事务来说是隔离的
  • 一致性:数据满足完整性约束,不存在中间状态,事务在执行前后数据库的状态都是正常的

ACID之间的关系

  • 原子性,持久性,一致性的目的都是为了实现一致性;一致性是最终目的,原子性、隔离性、持久性是为了保证一致性所做的措施。
  • 在涉及并发的情况下往往在要性能和一致性之间做平衡,做一定的取舍,所以隔离性也是对一致性的一种破坏。

MySQL是怎样实现ACID的

  • 原子性:依靠undo.log实现,在事务失败是执行回滚,undo.log会记录事务执行的SQL,当事务需要回滚时,通过反向补偿回滚数据库状态。
  • 持久性:依靠redo.log实现,MySQL持久化通过缓存来提高效率,在select时先查询缓存,再查询磁盘;在update时,先更新缓存,再更新磁盘。以减少磁盘io次数,提高效率。但缓存中的数据在断电后会丢失,所以需要先写redo.log。在执行修改操作,sql会先写入redo.log,再写入缓存,这样即使断电,数据也不会丢失。
  • 隔离性:通过锁和MVCC实现,写写隔离MySQL的锁机制来实现,读写隔离靠MVCC机制来实现。
  • 一致性:首先要保证原子性,持久性,隔离性;其次,MySQL底层通过两阶段提交事务保证了保证了redo.log和binlog之间的数据一致性,事务持久化时的一致性。
    第一阶段提交,将redo.log提交到磁盘,并将状态改为prepare状态,binlog不做任何操作。
    第二阶段提交,1、生成事务操作的bin.log,并将bin.log写入到磁盘中。2、调用引擎的提交事务接口,将redo.log的状态从prepare改为commit,事务提交完成。
    当事务提交时redo.log处于prepare阶段时,发生MySQL宕机或崩溃,则会执行事务回滚。
    当事务提交redo.log处于commit阶段时,发生了崩溃会执行事务恢复,本机事务通过redol og进行恢复

标签:事务,log,MySQL,一致性,ACID,redo,隔离
来源: https://www.cnblogs.com/9-5-2-7/p/16104629.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有