【数据库】ACID底层实现原理

前言

我们在学MySQL的时候事务是必须要知道的部分,也就是原子性(Atomic)、一致性(Consistency)、隔离性(isolation)和持久性(Persistence)。知道他的概念其实是远远不够的,现在越来越卷,那么就必须知道的他的原理什么?怎么是实现的。

原理

原子性:
概念

是指事物是一个不可分割的工作单位,事物中的操作要么都发生,要么都不发生。最经典的就是转账案例,我们把转入和转出当做一个事物的话,就需要在SQL中显式指定开启事务。

实现原理:undo log

undo log 是 回滚日志也叫逻辑日志 是实现原子实现事务原子性和隔离性实现的基础。首先我们要清楚的是在实现原子性的是是由一个回滚的操作,回滚就是说我们在执行操作的时候那么我们会执行一个相反的操作来是数据库的状态变成之前为操作的状态。

具体的实现原理:在数据库执行操作的时候,InnoDB会生成一个undo log日志,里面包含的是数据库的SQL语句,如果说数据库的操作失败的时候,会调用rollback,导致事务回滚,那么InnoDB就可以利用undo log 进行一个回滚的操作,具体是如果说你之前执行的是insert操作那么就会执行一个相反的delete操作,之前执行的是delete操作那么就会执行一个insert操作,或者之前执行的是update操作那么就会执行一个反向的update操作。总得来说,就是InnoDB会根据回滚之前生成的undo log操作日志执行相反的操作

一致性
概念

是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。也就是说其他三个事务特性最终的目的的就是为了达到这个一致性效果。

隔离性
概念

指的是多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。需要使用mvcc实现。如果不知道什么是MVCC的或者不知道其底层实现的可以去看我的前面几篇博客,写的很详细。https://blog.csdn.net/Ppphill_C/article/details/123833430?spm=1001.2014.3001.5501

持久性
概念

意味着即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中,不会被回滚

实现原理:redo log

redo log 是事务日志,用于保证事务的持久性。在这之前我们先要知道一下为什么需要用到他然后我们在去掌握我们要怎么用它,以及他的工作原理是什么?

我们都知道在数据库的操作过程中,一开始的话都是直接访问数据库的。所以效率并不是特别的好,并不能满足要求。因此就提出了一个buffer pool 这个概念,其中 buffer pool 是对数据库磁盘数据的一个映射,我们在操作的时候直接去读取buffer pool 就不必去读取数据库,那么buffer pool 会隔一段时间对数据库进行数据的更新操作,那么这一个过程又称 “刷脏”。

有了这个buffer pool 的加入可以大大的加快的数据库的访问速度,整体的提升了工作的效率。但是有一个不好的地方就是,如果说MySQL宕机了,buffer pool 开始刷脏,那么这个时候就会是数据的丢失。这就不符合我们的持久性问题了。因此,就提出了redo log这个日志来保证持久性。

首先我们要知道的是redo log 是采用的一种叫(Write-ahead logging)预先写的方法,换句话就是说所有的修改先写入日志,然后在更新到buffer pool。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。这样就保证了数据不会因为MySQL宕机而丢失,从而满足持久性的要求。

我们可以根据下面这张图来加深一下理解:
在这里插入图片描述

这边大家应该会有这么一个疑问就是:既然redo log 也可以写入磁盘,那为什么他会比Buffer pool写入的时候更快呢?

  • 刷脏是随机IO,因为每次修改的数据位置随机,但写redo log是追加操作,属于顺序IO

  • ​刷脏是以数据页(Page)为单位的,MySQL默认页大小是16KB,一个Page上一个小修改都要整页写入;而redo log中只包含真正需要写入的部分,无效IO大大减少。这就有点redis中的AOF持久化的工作原理的味道了。

结语

好了,MySQL的事务就讲完了,希望能够给你带来帮助!收工~

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring MVC 是一种基于Spring框架的Web开发框架,它是基于模型-视图-控制器(MVC)设计模式来组织和管理Web应用程序的开发的。数据库事务是保证数据操作的一致性和可靠性的重要机制。 在Spring MVC中,数据库事务的实现主要依赖于Spring框架内置的事务管理器。Spring框架为我们提供了多种事务管理器的实现方式,例如基于JDBC的DataSourceTransactionManager和基于JPA的JpaTransactionManager等。这些事务管理器实现了Spring的PlatformTransactionManager接口,它负责管理和控制事务的生命周期。 Spring MVC中使用注解@Transactional来标注需要参与事务管理的方法或类。被@Transactional标注的方法或类,会在运行时被Spring框架内置的AOP机制拦截,以实现事务的控制。当方法被调用时,Spring框架首先会检查当前线程是否已经有一个事务实例存在,如果不存在则创建一个新的事务,如果存在则加入已存在的事务中。 一旦事务创建成功,Spring框架会开始执行方法体中的业务逻辑操作。如果方法执行成功,事务将会继续提交,操作的结果将会永久保存到数据库中。如果方法执行失败或发生异常,Spring框架会回滚事务,将操作的结果恢复到之前的状态。这样可以确保在出现异常情况时,数据库的数据不会被污染或损坏。 事务的提交和回滚是由Spring框架的事务管理器来完成的。事务管理器负责管理事务的开始、提交和回滚等操作,并与底层数据库连接进行交互。Spring框架还提供了各种配置选项,可以通过配置文件或注解来灵活地控制事务的传播行为、隔离级别、超时设置等。这些配置选项可以根据实际业务需求进行调整,以提供更好的性能和可靠性。 总而言之,Spring MVC中的数据库事务的实现原理是依赖于Spring框架提供的事务管理器和AOP机制。通过使用@Transactional注解,我们可以简单地将需要参与事务管理的方法或类进行标注,使其具备事务性的功能。这样可以实现数据库操作的一致性和可靠性保证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

聪明不喝牛奶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值