MYSQL篇--事务机制高频面试题

事务

1 什么是数据库事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
事务最经典也经常被拿出来说例子就是转账了。
假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明
的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。
所以事务就是保证这两个关键操作要么都成功,要么都要失败。

2 事物的四大特性(ACID)介绍一下? 以及对应的实现原理说下

四大特性也就是原子性,一致性,隔离性,持久性
首先我们看原子性说白了就是当前事务的操作要么同时成功,要么同时失败,而原子性其实是由undo log日志来保证的
(这里简单介绍下undo log,undo log他其实是一种用于撤销回退的日志,也就是说在事务没提交之前 mysql会先记录更新前的数据到undo log日志文件中,当事务回滚时,可以用undo log来进行数据回滚,其实说白了undolog就是用执行的反向sql语句来进行回滚)

接着看隔离性:隔离性其实就是事务在并发执行过程中,不能互相干扰,而隔离性其实是由mysql中的各种锁以及mvcc机制实现
(之后会具体介绍mvcc等机制)

再看持久性持久性简单的理解就是一旦你提交了事务,那么它对于数据库的改变就是持久的,而持久性其实是由redo log日志来保证的
(这里也简单的说下redo log日志,首先 我们要知道当我们修改某条记录的时候其实并不是立刻刷入到磁盘的,而是会写buffer pool并将buffer pool标记为脏页,与此同时将本次对页的修改以redo log的形式记录下来,而后续innodb会在合适的时候通过后台线程将缓存再buffer pool中的脏页刷入到磁盘,这其实就是WAL技术
说白了WAL 就是mysql的写操作并不是立刻写到磁盘,而是先写文件,然后再合适的时间在写磁盘,
而正是因为有redo log的存在,即便系统崩溃了,还没来得及持久化脏页数据,mysql在重启后,会根据redo log的内容,将所有数据恢复到最新的状态。)

一致性:使用事务的最终目的,而一致性其实是由原子性,隔离性,持久性,这三个特性,以及业务代码正确逻辑来保证的
为啥说要保证正确逻辑呢?举个例子 比如说现在你先下单,在扣减库存,你下单成功了,但是扣减库存报错了,而你在try中执行的业务逻辑,catch中捕获时只是输出了日志并没有抛出异常,这就是导致了问题,即下单成功了,但是扣减库存失败了,所以说还需要保证逻辑的正确性

3 什么是脏读?幻读?不可重复读?

脏读:就是一个事务读取到了另外一个未提交事务的修改过的数据,就意味着发生了脏读,
简单解释下 就是比如事务A更新了一份数据,但是没有提交,而与此同时事务B也来读取相同的数据,因为事务A没有提交所以他随时是可以回滚的,一旦事务A发生回滚,那么事务B所读取的数据就是过期数据,这种现象就是脏读;

不可重复读:在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了不可重复读现象
而发生不可重复读可能是因为两次查询过程中间插入了事务更新原有数据的操作;
比如说现在有两个事务A和B,事务A先读取数据,之后继续执行逻辑处理,而在这过程中事务B更新了这条数据并提交了事务,那么当事务A再次读取数据的时候,就会发现前后两次读取到的数据不一致性

幻读:在一个事务的两次查询中,数据的记录条数不一致,这就意味着幻读
简单说下 比如说现在有事务A和B,他们同时在处理,一开始事务A进行范围查询,查询的记录条数为3条,同时事务B也按相同的查询条件去查,也查出了3条记录,紧接着,事务A在这个范围中插入了一条记录,并提交了事务,那么此时数据库的条数就变成了4条,而事务B再次去查的时候就是4条记录,就和之前查询的记录数量不一致了,这种现象就是幻读

4 那什么又是隔离级别,有哪几种隔离级别呢?

首先我们要知道 正是因为事务在并发执行的过程中可能会遇到上面的各种问题–即脏读,幻读,不可重复读,也就是会对事务的一致性产生不同程度的影响,所以才引入隔离级别来去解决这些问题

有哪几种隔离级别-有读未提交,读已提交,可重复读,串行化四种隔离级别,隔离级别是由低到高,同时隔离级别越高,性能也就越差
读未提交:最低的隔离级别,也就是允许读取尚未提交的数据变更,可能会发生脏读,幻读或者不可重复读
读已提交:见名知义-即允许读取并发事务中已经提交的数据,可能会发生幻读或者不可重复读
可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
串行化: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是性能最差

这里需要注意的是:
Mysql 默认采用的 REPEATABLE_READ隔离级别
Oracle 默认采用的 READ_COMMITTED隔离级别
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多
版本并发控制)
通过undo log版本链和readview机制来支持并发一致性读和回滚等特
性。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是
READ-COMMITTED(读取提交内容):,
但是你要知道的是InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)并不会有任何性能损失。
InnoDB 存储引擎在 分布式事务 的情况下一般会用到
SERIALIZABLE(可串行
化)**隔离级别。

5 MVCC机制了解吗?

首先我们要理解mvcc多版本并发控制,它其实主要是为了解决在RC,RR这种隔离级别下,读和写并发冲突的问题
这里的多版本就是多个undo日志版本链,
只要你对数据做了修改,不管你有没有提交 它都会加入到版本链中去,每条记录-id 都有自己的版本链
在这里插入图片描述
ReadView 是针对当前事务的,RR隔离级别下也就是说当你开启一个事务,进行查询的时候
它在那一刻查询到的readview 和你之后查询到的都是一样的,
注意你执行了更新操作,那其实是执行了当前读,之后这个视图再去查询,查询到的这条记录都是你更新后的。 但是注意readview并没有变,如果你查询其他的记录,还是需要拿着readview根据可见性视图算法规则去查找
而RC隔离级别是每一次查询都会查到当前最新的readview视图,都取了当前事务活跃事务和未活跃事务的状态

在这里插入图片描述
在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前永远都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成read-view),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。
版本链比对规则:

  1. 如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的;
  2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若 row 的 trx_id 就是当前自己的事务是可见的);
  3. 如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况
    a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务是可见的);
    b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。

所以RR隔离级别和RC隔离都是适用上述的可见性算法规则,区别只是查询到的readView视图不同

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

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

相关文章

图纸版本管理混乱怎么办?彩虹PDM系统帮你搞定!

在现代制造业和工程领域&#xff0c;图纸版本管理的混乱常常是一个棘手的问题。不同版本的图纸可能导致严重的错误和生产问题&#xff0c;影响了产品质量和交付时间。然而&#xff0c;有一个强大的工具可以帮助企业解决这个问题&#xff0c;那就是PDM产品数据管理系统。彩虹PDM…

云流量回溯的工作原理及关键功能

云计算和网络技术的快速发展为企业提供了更灵活、高效的业务运营环境&#xff0c;同时也引发了一系列网络安全挑战。在这个背景下&#xff0c;云流量回溯成为网络安全领域的一个关键技术&#xff0c;为企业提供了对网络活动的深入洞察和实时响应的能力。 一、 云流量回溯的基本…

pkuseg按照用户自定义词典分词错误修正

import pkusegc pkuseg.pkuseg(user_dict"./data/dict.txt") sentence 数字传播实验班 print(c.cut(sentence))字典中包含“”数字传媒与人文学院"&#xff0c;添加自定义词典后&#xff0c;文本被错误分成““数字传 播 实验班” &#xff0c;debug发现solve…

OpenShift 4 - 在 OpenShift 上运行物体检测 AI 应用

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 RHODS 2.5.0 的环境中验证 说明&#xff1a;请先根据《OpenShift 4 - 部署 OpenShift AI 环境&#xff0c;运行 AI/ML 应用&#xff08;视频&#xff09;》一文完成 OpenShift AI 环境…

python爬虫实战(8)--获取虎pu热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求地址 def fetch_data():url "https://bbs.xxx.com/" # Replace with the actual base URLresponse requests.get(url)if response.status_code 200:return response.c…

2024年最火爆的本地生活服务商平台推荐!

随着互联网的发展&#xff0c;本地生活团购服务市场逐渐成为各大平台争夺的焦点。视频号、DY等短视频平台纷纷入局&#xff0c;希望通过本地生活团购的形式吸引更多的用户&#xff0c;提高平台的活跃度和黏性。对于想要成为本地生活团购服务商的创业者来说&#xff0c;都不想放…

web期末作业网页设计——JavaScript

目录 一.作品简介 二.网页效果 首页 花语 登录界面 注册界面 三.网页代码 首页 登录界面 注册界面 视频界面 一.作品简介 网站系统文件种类包含&#xff1a;html网页结构文件、css网页样式文件、js网页特效文件、images网页图片文件。 网页作品代码简单&#xff…

2024 年 10 款最佳 Android 手机数据恢复软件榜单

当您因某些不合时宜的事故而丢失 Android 设备上的重要数据时&#xff0c;这真是一场灾难。如果您遇到这样的情况&#xff0c;请不要担心。我们列出了一些最好的 Android 数据恢复软件&#xff0c;可以帮助您使用 PC 检索手机丢失的数据。 在用于存储重要数据的各种存储设备中…

你真的掌握了“C语言分支循环”吗

目录 前言 1. if语句 1.1 if 1.2 else 1.3 分支中包含多条语句 1.4 嵌套if 1.5 悬空else问题 2. 关系操作符 3. 条件操作符 4. 逻辑操作符&#xff1a;&& , || , &#xff01; 4.1 逻辑取反运算符 4.2 与运算符 4.3 或运算符 4.4 练习&#xff1a;闰年的判…

【一周年创作总结】人生是远方的无尽旷野呀

那一眼瞥见的伟大的灵魂&#xff0c;却似模糊的你和我 文章目录 &#x1f4d2;各个阶段的experience&#x1f50e;大一寒假&#x1f50e;大一下学期&#x1f50e;大一暑假&#x1f50e;大二上学期&#xff08;现在&#xff09; &#x1f354;相遇CSDN&#x1f6f8;自媒体&#…

uniapp使用wxml-to-canvas开发小程序保存canvas图片

微信小程序官方解决方案&#xff1a;wxml-to-canvas 使用wxml-to-canvas要知道一些前提条件 1、只能画view&#xff0c;text&#xff0c;image 2、每个元素必须要设置宽高 3、默认是flex布局&#xff0c;可以通过flexDirection: "column"来改变排列方式 4、文字 必…

云服务器搭建GitLab

经验总结&#xff1a; 1、配置需求&#xff1a;云服务器内存最低4G 2、内存4G的云服务器&#xff0c;在运行容器后&#xff0c;会遇到云服务器操作卡顿问题&#xff0c;这里有解决方案 转载&#xff1a;服务器搭建Gitlab卡顿解决办法-CSDN博客 3、云服务器的操作系统会影响…

ROS建图之ROS标准REP-105(官方搬运翻译+个人理解)

REP-105 是一个由 Wim Meeussen 于 2010年10月27日 创建并维护的&#xff0c;名为 "Coordinate Frames for Mobile Platforms"&#xff08;移动平台的坐标系框架&#xff09;的 ROS Enhancement Proposal&#xff08;REP&#xff09;。ROS官方教程&#xff1a;REP 10…

Page 251~254 Win32 GUI项目

win32_gui 源代码&#xff1a; #if defined(UNICODE) && !defined(_UNICODE)#define _UNICODE #elif defined(_UNICODE) && !defined(UNICODE)#define UNICODE #endif#include <tchar.h> #include <windows.h>/* Declare Windows procedure */…

【Vue2】一个数组按时间分割为【今年】和【往年】俩个数组

一. 需求 后端返回一个数组&#xff0c;前端按时间维度将该数组的分割为【今年】和【往年】俩个数组后端返回的数组格式如下 timeList:[{id:1,billTime:"2024-01-10",createTime:"2024-01-10 00:00:00",status:0},{id:2,billTime:"2022-05-25"…

EVE-NG初次启动及WEB客户端访问来了

本章从虚拟机Eve模拟器启动、模拟器的启动配置、浏览器访问三个步骤讲解EVE-NG的首次启动。 1.启动模拟器 打开虚拟机环境&#xff0c;启动安装好的EVE-NG虚拟机&#xff0c;进入如下界面。 登录时输入社区版默认账户是root&#xff0c;密码是eve&#xff0c;完成登陆。 1.配置…

00后网文作家年入百万,跻身“十二天王”之列!

各位书友们&#xff0c;有没有觉得现在网文界越来越风起云涌&#xff1f;最近&#xff0c;2023年网络文学榜样作家“十二天王”出炉&#xff0c;其中一位00后作家季越人引起了广泛关注&#xff01;这位公共管理系的大四学生凭借他的第一部网文小说《玄鉴仙族》一鸣惊人&#xf…

Ubuntu系统中指定端口防火墙状态查询与操作

浏览器访问&#xff1a; 如果遇到如山图所示的情况&#xff0c;既有可能是防火墙的问题。具体解决方案参照如下&#xff1a; 1.指定端口的防火墙状态查询 &#xff08;1&#xff09;查询命令 sudo ufw status | grep 8081/tcp #其中8081为要查询的端口号 如果端口是打开的…

达梦数据库的使用

文章目录 一、安装程序介绍1.dm管理工具2.dm服务查看器3.数据迁移工具 二、达梦数据库联机备份与还原操作1.配置归档2.备份1.归档备份 3.备份还原 一、安装程序介绍 官网文档&#xff1a;https://eco.dameng.com/docs/zh-cn/faq/faq-import-export.html 达梦数据库安装成功后…

windows安装RabbitMq,修改数据保存位置

1、先安装Erlang&#xff0c; Erlang和RabbitMQ有版本对应关系。 官网RabbitMQ与Erlang版本对应RabbitMQ Erlang Version Requirements — RabbitMQ 2、安装RabbitMQ。 3、修改数据保存地址。找到安装目录下的sbin文件夹&#xff0c;找到rabbitmq-env.bat&#xff0c;编辑文件…
最新文章