INNODB是如何实现事务的?

1、什么是事务

通俗来说就是一组SQL语句,而且这组SQL要么同时都执行成功要么同时都不成功。

事务的特性:

特征说明
原子性(A)一个事务中的所有操作,要么全都成功,要么全都不成功,不会结束在中间某个环节;
一致性(C)事务开始之前和结束之后,数据库的完整性没有被破坏;
隔离性(I)要求每个读写事务的操作对象与其他事务的操作对象能相互隔离;
持久性(D)事务一旦提交,其结果就会持久化,就算发生宕机也能恢复数据;

2、InnoDB存储引擎对ACID的实现方式

利用回滚日志(undo log)重做日志(redo log) 两种表实现事务,并实现 MVCC (多版本并发控制)

在执行事务的每条SQL时,会先将数据原值写入undo log 中, 然后执行SQL对数据进行修改,最后将修改后的值写入redo log中。

redo log 重做日志包括两部分:1 是内存中的重做日志缓冲 ;2 是重做日志文件。在事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务commit操作完成才算完成。

当一个事务中的所有SQL都执行成功后,会将redo log 缓存中的数据刷入磁盘,然后提交。

如果发生回滚,会根据undo log 恢复数据。

特征INNODB实现方式
原子性(A)回滚日志(undo log):用于记录数据修改前的状态;
一致性(C)重做日志(redo log):用于记录市局修改后的状态;
隔离性(I)锁:用于资源隔离,分为共享锁和排它锁;
持久性(D)重做日志(redo log) + 回滚日志(undo log);

3、MVCC 多版本并发控制

查询需要对资源加共享锁(S),数据修改需要对资源加排他锁(X)

排他锁共享锁
排他锁不兼容不兼容
共享锁不兼容兼容

利用undo log使读写不阻塞,实现了可重复读。当一个事务正在对一条数据进行修改时,该资源会被加上排它锁。在事务未提交时对加锁资源进行读操作时,读操作无法读到被锁资源,通过一些特殊的标志符去读undo log 中的数据(过程很复杂),这样读到的都是事务执行之前的数据。


相关资料:

mysql技术内幕–innodb存储引擎图解(超级详细)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值