滴滴面试:什么是数据库事务?InnoDB一次事务的执行过程?

尼恩说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如滴滴、阿里、极兔、有赞、shein 希音、百度、网易的面试资格,遇到很多很重要的面试题:

什么是数据库事务?

说说 InnoDB一次事务的执行过程?

小伙伴 没有回答好,导致面试挂了,来求助尼恩,如何才能回答得很漂亮, 让面试官刮目相看、口水直流。

所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。

当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典》V136版本PDF集群,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】取

文章目录

    • 尼恩说在前面
    • 什么是数据库事务?
    • 如何理解ACID?
      • 1. 原子性
      • 2. 一致性
      • 3. 隔离性
      • 4. 持久性
    • InnoDB的一次更新事务是怎么实现的?
      • 1. 加载数据到缓存中(Buffer Pool)
      • 2. 写入Undo Log
      • 3. 更新内存数据
      • 4. 写入Redo Log
      • 5. 提交事务
      • 6. 写入BinLog
      • 7. 刷新脏页到磁盘
    • 综上所述
    • 说在最后
    • 尼恩技术圣经系列PDF

什么是数据库事务?

数据库事务( transaction) 是指作为一个逻辑工作单元执行的一系列数据库操作,这些操作要么全部成功,要么全部失败,是一个不可分割的工作单元。

事务是在事务开始和事务结束之间执行的一系列数据库操作。

事务的目的是确保数据库操作的一致性和完整性,同时提供对并发访问的隔离性和恢复能力。

注意:请点击图像以查看清晰的视图!

事务具有四个核心特性,也被称为ACID特性:

原子性(Atomicity):事务中的操作要么全部成功,要么全部失败,不存在部分成功的情况。例如,在转账操作中,要么全部完成,要么全部取消,以确保资金的一致性。

如果事务失败,系统会回滚到事务开始前的状态,保证数据的一致性。回滚操作会将数据库恢复至事务开始前的状态,以消除任何可能的不一致性。

一致性(Consistency):事务执行前后,数据库必须保持一致性状态。

这意味着事务要将数据库从一个一致性状态转移到另一个一致性状态。一致性确保了数据始终处于有效且符合业务规则的状态。如果事务成功提交,数据库将处于有效状态;若事务失败,数据将回滚至事务开始前的状态。一致性是数据库事务的核心目标,因为它确保了数据在事务执行过程中的正确性。

例如,在转账操作中,转账前后的账户余额总和应该保持不变。

隔离性(Isolation):并发执行的多个事务之间应该相互隔离,互不干扰。

隔离性确保每个事务都是独立的,不受其他事务的影响。每个事务都应该感知不到其他事务的存在,以避免数据的不一致和并发访问的问题。隔离级别可以控制事务之间的隔离程度,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)等。

持久性(Durability):一旦事务提交成功,对数据库的修改应该永久保存,即使系统发生故障或重启。

持久性确保了事务的最终一致性,即使系统在执行过程中出现故障,事务提交后的数据也应保持不变。系统应该能够恢复到事务提交后的状态,保证数据的持久性。

这四个特性被称为ACID特性,是保证数据库事务正确执行的基本要素。通过这些特性,确保了数据库操作的一致性、完整性和可靠性。在此基础上,事务可以更好地满足并发控制、数据稳定和故障恢复等方面的需求。

如何理解ACID?

在计算机科学中,ACID(原子性、一致性、隔离性、持久性)是数据库事务处理的基本特性,它在保证数据正确性和完整性方面起着至关重要的作用。我们可以通过一个常见的例子——银行转账来解释ACID的概念。

假设有一个银行数据库,其中包含两个表:信用卡表和储蓄表。

现在,用户A要将信用卡中的100元转移到储蓄账户中。这个转账过程需要遵循ACID特性。

1. 原子性

转账过程中的操作要么全部成功,要么全部失败。

以银行转账为例,如果用户A要将信用卡中的100元转移到储蓄账户中,那么转账过程中的所有操作(包括扣款和存款)要么全部成功,要么全部失败。如果其中一个操作失败,例如扣款成功但存款失败,那么系统会回滚到事务开始前的状态,之前的所有操作都将回滚,以保证数据的一致性。

2. 一致性

转账过程中,数据库必须保持一致性状态。这意味着转账前后的账户余额总和应该保持不变。

例如在转账之前,信用卡和储蓄账户中共有500+500=1000元钱。

如果转账成功,信用卡余额减少100元,储蓄账户余额增加100元,在转账之后,两个账户中共有400+600=1000元。保持了数据的一致性。

3. 隔离性

在转账过程中,多个用户可能同时进行转账操作。

隔离性确保每个用户的转账操作互不干扰,彼此独立进行。

例如,如果用户B同时也要将100元从信用卡转移到储蓄账户,他的转账操作应该与用户A的转账操作相互隔离,互不干扰。

4. 持久性

一旦转账操作成功提交(即事务提交),两个账户中的金额就会真正发生变化,并将数据写入数据库以进行持久化保存。

系统应该能够恢复到转账提交后的状态,保证数据的持久性。

通过遵循ACID特性,银行可以确保转账操作的正确执行,保证数据的一致性和完整性。总之,事务处理在需要保证数据一致性和完整性的场景中具有广泛的应用,如银行转账、在线支付等。使用事务可以简化应用程序的开发和维护,提高数据的可靠性和安全性。

注意:请点击图像以查看清晰的视图!

InnoDB的一次更新事务是怎么实现的?

InnoDB的一次更新事务涉及到多个组件和步骤,包括Buffer Pool、BinLog、UndoLog、RedoLog以及物理磁盘。

下面是一次完整的事务更新操作过程:

1. 加载数据到缓存中(Buffer Pool)

在进行数据更新时,InnoDB首先在缓冲池(Buffer Pool)中查找待更新记录是否已经在内存中。若记录不在内存中,InnoDB会将记录从磁盘文件读取到缓冲池(Buffer Pool)中。

缓冲池是InnoDB存储引擎提供的临时存储区,用于提升数据读取和修改的速度。将数据加载到缓冲池后,后续的更新操作均在缓冲池内进行。这样可以减少磁盘I/O操作,从而提高事务处理速度。缓冲池在内存中存储数据,可以降低磁盘I/O的开销,提高数据读取和写入的速度,从而优化事务处理性能。

2. 写入Undo Log

在更新数据之前,InnoDB会将原始数据的副本写入Undo Log(回滚日志)。

Undo Log是保证事务回滚和并发控制的关键部分,也是确保事务原子性和一致性的重要机制。Undo Log记录了事务开始前的数据状态,以便在需要回滚时进行数据恢复。通过记录撤销日志,InnoDB能够实现事务的滚动回滚,提高事务处理的灵活性。撤销日志在事务处理过程中起到了关键作用,它记录了事务的修改过程,使得事务能够在需要时回滚到之前的状态,保证数据的一致性和完整性。

3. 更新内存数据

接下来,InnoDB会在缓冲池中更新数据。

这意味着,当执行update语句时,InnoDB会先更新已经读取到Buffer Pool中的数据,修改操作会直接在内存中进行,而不是立即写入磁盘。

此时,缓冲池中的数据被标记为"脏页",表示与磁盘上的数据不一致。脏页是缓冲池中已经被修改但尚未写入磁盘的数据页,它需要后续的处理才能将修改同步到磁盘,保证数据的持久性。

4. 写入Redo Log

为了保证事务的持久性,InnoDB在Buffer Pool中记录修改操作的同时,InnoDB会先将更新操作写入Redo Log(重做日志)。

Redo Log是一种物理日志,它记录了事务对数据库的修改操作。通过Redo Log,即使系统发生故障,也可以通过重做日志来恢复事务修改后的状态。这一机制保证了事务的可靠性,降低了系统故障带来的风险。重做日志是保证数据持久性和恢复性的关键,它记录了事务的修改过程,使得事务的修改能够在故障恢复后得到恢复。

5. 提交事务

当事务完成所有的更新操作后,事务被提交。在提交事务时,InnoDB会将事务标记为"准备提交"状态。

此时,事务的修改操作仍然在缓冲池中,尚未写入磁盘。事务提交是事务处理的重要环节,它标志着事务处理完毕,可以进行后续的提交操作。在提交之前,事务的修改操作需要得到处理,保证数据的完整性和一致性。

6. 写入BinLog

在事务提交之后,InnoDB会将事务的修改操作写入BinLog(归档日志)。

BinLog是MySQL的二进制日志,用于记录数据库的所有修改操作。在归档日志中记录的信息包括:事务开始的时间、数据库名、表名、事务ID、SQL语句等。它可以用于数据恢复、主从复制、数据分析和同步等场景。归档日志在数据库中起到了关键作用,它记录了数据库的修改过程,使得数据库的修改能够在故障恢复后得到恢复。

7. 刷新脏页到磁盘

最后,在提交过程完成后,InnoDB会将缓冲池(Buffer Pool)中的脏页刷新到物理磁盘上的数据文件中。

这个过程称为"刷脏"。通过刷脏操作,将缓冲池中的修改操作同步到磁盘,确保数据的持久性。

然而,这个写入过程并非立即执行,而是由后台线程异步执行的,因此可能会有一定的延迟。总而言之,MySQL会在适当的时机选择将数据写入磁盘以进行持久化。

综上所述

InnoDB的数据更新事务涉及多个关键环节和步骤,包括数据预处理、记录撤销日志、更新内存数据、记录重做日志、事务提交、记录归档日志以及刷新脏页到磁盘。这些步骤确保事务具备原子性、一致性、隔离性和持久性,保障数据库操作正确执行和数据完整性。在实际应用中,了解这些细节有助于更好地优化数据库性能和事务处理。

注意:请点击图像以查看清晰的视图!

说在最后

数据库事务面试题,是非常常见的面试题。

以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,并且在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/208117.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab 点云线性指数计算(加权)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 思路其实很简单,即对每个邻近点集中的点,根据其到点集中心的距离进行加权处理(权重函数),之后再基于加权之后的点获取其协方差矩阵,最后再求取其相关的特征值,以此来获取该点的线性指数。相关公式如下所示:…

pytorch中Conv1d、Conv2d与Conv3d详解

1 卷积介绍 1.1 什么是卷积 卷积(convolution),是一种运算,你可以类比于加,减,乘,除,矩阵的点乘与叉乘等等,它有自己的运算规则,卷积的符号是星号*。表达式…

TCP简介及特性

1. TCP协议简介 TCP是Transmission Control Protocol的简称,中文名是传输控制协议。它是一种面向连接的、可靠的、基于IP的传输层协议。两个TCP应用之间在传输数据的之前必须建立一个TCP连接,TCP采用数据流的形式在网络中传输数据。TCP为了保证报文传输的…

Python+Requests模拟发送post请求

模拟发送post请求 发送post请求的基础知识dumps和loads 代码示例: # 发送post请求 import requests,json # 发送post请求的基础知识dumps和loads str_dict {name:xiaoming,age:20,sex:男} print(type(str_dict)) str1 json.dumps(str_dict) # 1,json.dumps 是把…

windows判断端口是否在使用的bat脚本

脚本 REM 查询端口是否占用 netstat -ano|findstr 3306 >nul &&echo y >1.log ||echo n >1.log REM 读取文本内容赋值给变量 set /P resu<1.log if %resu% y (echo port in use ) else (echo port not in use ) mysql服务不运行的时候检测效果 mysql服…

【Excel】WPS快速按某列查重数据

查重值 excel列几条数据肉眼可见&#xff0c;如何千万级别数据查验呢&#xff1f;平时很少用&#xff0c;记录一下: 先框选列要验证的数据&#xff0c;然后&#xff1a;开始->条件格式->突出显示单元格规则->重复值 效果

成都理工大学校园《我想假如在这里度过大学生活》火了

近日&#xff0c;网上一篇关于成都理工大学校园环境的《我想假如在这里度过大学生活》火了。文章中的提到的大学环境优美&#xff0c;诗意盎然。一则则假如&#xff0c;带我们领略了校园风光&#xff0c;同时也感受到了大学时代的美好。 美丽的图书馆、阳光明媚的操场&#xff…

HNU-计算机网络-讨论课2

第二次 有关网络智能、安全以及未来网络的讨论 一、必选问题&#xff08;每组自由选择N个&#xff0c;保证组内每人负责1个&#xff09; 网络的发展促进信息的传播&#xff0c;极大提高了人类的感知能力&#xff0c;整个世界都被纳入人类的感知范围。但人们对信息系统以及数据…

Jenkins UI 自动化持续化集成测试

一&#xff1a;安装jenkins 环境 在官网下载msi 直接安装即可 二&#xff1a;设置全局变量 设置allure 路径 三&#xff1a;创建项目 1、创建自由风格项目 2、如果项目在本地&#xff0c;且本地服务器是windows &#xff0c;找到Jenkins安装根目录&#xff0c;寻找config…

Serilog .net下的新兴的日志框架

Serilog .net下的新兴的日志框架 1.Serilog简介 Serilog 是针对 .NET 应用程序的流行日志记录框架。它以其灵活性、易用性和可扩展性而闻名。借助 Serilog&#xff0c;开发人员可以轻松记录应用程序中的事件、错误和消息。它支持结构化日志记录&#xff0c;能够以结构化格式存…

B.牛牛排队伍——模拟双链表

当前位置: 首页 > news >正文 B.牛牛排队伍——模拟双链表 news 2023/12/1 15:14:37 分析 题目其实很简单,就是双链表的增删查,但是刚开始,直接vis标记删除元素,查找一个位置的前一个用的while不断向前找,但是TLE;毕竟O(n*k)的复杂度,一开始没有考虑时间复杂度…

【spring】bean的后处理器

目录 一、作用二、常见的bean后处理器2.1 AutowiredAnnotationBeanPostProcessor2.1.1 说明2.1.2 代码示例2.1.3 截图示例 2.2 CommonAnnotationBeanPostProcessor2.2.1 说明2.2.2 代码示例2.2.3 截图示例 2.3 ConfigurationPropertiesBindingPostProcessor2.3.1 说明2.3.2 代码…

uniapp uni-popup组件在微信小程序中滚动穿透问题

起因 在微信小程序中使用uni-popup组件时&#xff0c;出现滚动穿透&#xff0c;并且uni-popup内部内容不会滚动问题。 解决 滚动穿透 查阅官方文档&#xff0c;发现滚动穿透是由于平台差异性造成的&#xff0c;具体解决可以参照文档禁止滚动穿透 <template><page-…

【动手学深度学习】(七)丢弃法

文章目录 一、理论知识二、代码实现2.1从零开始实现Dropout 【相关总结】np.random.uniform(low&#xff0c;high&#xff0c;size)astypetorch.rand() 一、理论知识 1.动机 一个好的模型需要对输入数据的扰动鲁棒 使用有噪音的数据等价于Tikhonov正则丢弃法&#xff1a;在层…

PVE系列-LVM安装MacOS的各个版本

PVE系列-LVM安装MacOS的各个版本 环境配置大概过程&#xff1a;详细步骤&#xff1a;1.建立安装环境和下载安装工具2. 重启后&#xff0c;执行osx-setup配置虚拟机3. 安装到硬盘&#xff0c;4.设定引导盘&#xff0c;以方便自动开机启动5.打开屏幕共享和系统VNC最后的结果 引子…

软件工程 - 第8章 面向对象建模 - 2 静态建模

静态建模&#xff08;类和对象建模&#xff09; 类和对象模型的基本模型元素有类、对象以及它们之间的关系。系统中的类和对象模型描述了系统的静态结构&#xff0c;在UML中用类图和对象图来表示。 类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛…

基于A*的网格地图最短路径问题求解

基于A*的网格地图最短路径问题求解 一、A*算法介绍、原理及步骤二、Dijkstra算法和A*的区别三、A*算法应用场景四、启发函数五、距离六、基于A*的网格地图最短路径问题求解实例分析完整代码 七、A*算法的改进思路 一、A*算法介绍、原理及步骤 A*搜索算法&#xff08;A star al…

Python 批量修改文件名

主要步骤 通过os.listdir查看该文件夹下所有的文件&#xff08;包括文件夹&#xff09;遍历所有文件&#xff0c;如果是文件夹则跳过&#xff0c;或指定跳过指定文件获取文件扩展名按照需求生成新的文件路径文件名进行重命名 代码示例 # -*- coding: utf-8 -*- import osdef…

二 使用GPIO的复用功能 利用USART 实现printf()

参考这篇&#xff1a; STM32串口通信详解 1. 关于USART USART ( universal synchronous / asynchronous receiver /transmitter) 是一种串行通讯协议 , 允许设备通过串行端口进行数据传输&#xff0c; USART 能够以同步或者异步的方式进行工作&#xff0c;在实际的运用中&…

局域网协议:以太网(Ethernet)详解

文章目录 Ethernet的组成以太网和 Wi-Fi以太网应用场景以太网的发展历程以太网数据链路层CSMA/CD (载波侦听多路访问/冲突检测)推荐阅读 以太网&#xff08;Ethernet&#xff09;是一种局域网&#xff08;LAN&#xff09;技术&#xff0c;用于在局域网范围内传输数据。它是最常…