Mysql Innodb是如何保证ACID的

一、原子性(A)

原子性主要由redo log和undo log来实现

1、redo log记录了数据页的修改,如果事务提交后宕机了,可以通过redo log将事务恢复到提交后的状态。

2、undo log记录了各个事务的版本,如果事务失败需要回滚,那么可以利用undo log来恢复数据。

二、持久性(D)

主要通过redo log和二次写来实现

1、redo log记录了数据页的修改,可以通过它来恢复丢失的数据页

2、二次写:

  • 写入某个页到磁盘时,如果此时只写了一部分就宕机了,那么这时可以通过重做日志进行恢复;但是数据页也破坏了,那么就无法恢复事务了,所以写入redo log前,进行二次写,对页进行备份。
  • 对缓冲页进行刷新时,并不是直接写入磁盘,而是先将脏页复制到内存中的doubleWrite buffer中,之后通过doublewrite分两次,一次1M的写入共享表空间的物理磁盘上,然后调用fysnc进行同步刷盘。这个过程中,doublewrite也是连续的,写入很快。写入doublewrite到磁盘后,再将doublewrite buffer中的数据写入到各个表空间。

三、隔离性(I)

利用mvcc和锁实现。

1、针对各个不同的隔离识别,readview不同,针对可重复读的场景,利用mvcc保证读时不发生幻读,利用next key防止插入时发生幻读。

2、读未提交就是获取最新的事务;串行化使用互斥锁;RC和RP的快照读就通过mvcc,RC的当前读使用的是record_lock而RP使用的是Next-key Lock

四、一致性

通过上面以上3点一起保证一致性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ccu78150581

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值