mysql面试题四(事务)

目录

1.什么是数据库的事务

1. 原子性(Atomicity)

2. 一致性(Consistency)

3. 隔离性(Isolation)

4. 持久性(Durability)

2.事务的并发问题

1. 脏读(Dirty Read)

2. 不可重复读(Non-Repeatable Read)

3. 幻读(Phantom Read)

4. 丢失更新(Lost Update)

3.事务的隔离级别有哪些

读未提交(Read Uncommitted)

读已提交(Read Committed)

可重复读(Repeatable Read)

串行化(Serializable)

4.什么是Next-Key Locking

5.ACID 特性是如何实现的

1. 原子性(Atomicity)

2. 一致性(Consistency)

3. 隔离性(Isolation)

4. 持久性(Durability)


1.什么是数据库的事务

数据库的事务(Transaction)是在关系型数据库管理系统(如 MySQL)中,用于确保一组数据库操作在逻辑上被视为一个不可分割的整体,要么都执行,要么都不执行。事务有如下四个关键特性,通常被称为 ACID(Atomicity, Consistency, Isolation, Durability)属性:

1. 原子性(Atomicity)

原子性保证事务中的所有操作要么全部成功执行,要么全部不执行。也就是说,事务作为一个整体是不可分割的,如果事务中的任何部分失败,整个事务都将回滚到执行前的状态,就像这些操作从未发生过一样。这确保了数据库状态的一致性,避免了部分操作成功导致的数据不完整或不一致问题。

2. 一致性(Consistency)

一致性确保事务执行前后,数据库总处于一种合法的状态,符合预定的完整性约束(如外键约束、唯一性约束等)和业务规则。无论事务执行成功还是回滚,都不会破坏数据库的逻辑完整性。事务的执行结果应使数据库从一个一致性状态转换到另一个一致性状态。

3. 隔离性(Isolation)

隔离性要求在并发环境中,多个事务同时执行时,彼此之间互不影响,仿佛每个事务都在独立运行。为了实现这一点,数据库系统通常采用事务隔离级别(如读未提交、读已提交、可重复读、串行化等)来限制不同事务间的读写交互,防止出现脏读、不可重复读、幻读等并发问题。不同的隔离级别在并发性能和隔离程度之间做出权衡。

4. 持久性(Durability)

持久性确保一旦事务成功提交,其所做的更改就会永久保存在数据库中,即使在系统遇到故障(如断电、硬件故障、数据库崩溃等)的情况下也能得以恢复。数据库系统通常通过将事务日志(如 redo log)先行写入持久存储并在事务提交时进行同步或定期checkpoint来确保即使在意外中断后也能通过重放日志恢复已提交的事务。

在 MySQL 中,事务可以通过以下方式来管理:

  • 开始事务:使用 START TRANSACTION 或 BEGIN 语句明确启动一个事务。
  • 执行操作:在事务上下文中执行一系列的 SQL 查询和数据修改语句(如 INSERTUPDATEDELETE 等)。
  • 提交事务:使用 COMMIT 语句提交事务,将所有更改永久保存到数据库中,满足持久性,并释放事务期间持有的任何锁资源。
  • 回滚事务:在遇到错误或需要撤销已执行的操作时,使用 ROLLBACK 语句将数据库状态恢复到事务开始前的状态,撤销事务中所有已执行的操作。

事务机制是关系型数据库管理系统中实现可靠数据更新和并发控制的核心手段,它确保了即使在复杂的并发环境下,数据库也能保持数据的完整性和一致性,为应用程序提供了强大的数据操作保障。在涉及多步骤、跨表操作,或者需要确保业务逻辑完整性的场景中,正确使用事务至关重要。

2.事务的并发问题

MySQL 中的事务并发问题是指在多个事务同时执行时,由于缺乏适当的隔离控制,可能会引发的一系列数据一致性问题。这些问题是由于事务间操作的交错执行导致的,违反了事务的隔离性要求。以下是 MySQL 中常见的事务并发问题:

1. 脏读(Dirty Read)

问题描述:一个事务读取了另一个未提交事务修改的数据。如果那个未提交事务最终回滚,那么第一个事务读取到的就是临时且无效的数据,即“脏”数据。

示例:事务 A 修改了一条记录但未提交,事务 B 此时读取到了事务 A 修改后的数据。如果事务 A 后续回滚了其修改,事务 B 读取到的数据实际上是不存在的,造成了脏读。

2. 不可重复读(Non-Repeatable Read)

问题描述:在一个事务内,多次读取同一数据时,结果不一致,即同一查询在事务执行过程中得到了不同的结果。这是因为在两次读取之间,其他事务提交了对该数据的修改。

示例:事务 A 开始后,两次查询同一记录,第一次查询得到结果 R1。在此期间,事务 B 修改了该记录并提交。事务 A 第二次查询时得到结果 R2,与 R1 不同,出现了不可重复读。

3. 幻读(Phantom Read)

问题描述:在一个事务内,多次执行相同的范围查询,结果集中出现了之前未出现的行(或之前存在的行消失了),即同样的查询条件在事务执行过程中返回了不同的行集合。幻读通常发生在对范围或条件查询的场景中。

示例:事务 A 执行了一次范围查询,返回结果集 R1(包含一定范围内的若干行)。在此期间,事务 B 插入了新的行,这些行满足事务 A 的查询条件。事务 A 后续再次执行同样的范围查询,结果集 R2 包含了事务 B 新插入的行,即出现了幻读。

4. 丢失更新(Lost Update)

问题描述:两个事务同时更新同一数据项,其中一个事务的更新结果被另一个事务覆盖,导致前者所做的更改丢失。

示例:事务 A 和事务 B 同时读取某一行的值 V1,各自计算出新的值(假设为 V2 和 V3),然后分别提交更新。若事务提交顺序为 A -> B,那么最终数据变为 V3,事务 A 的更新被事务 B 覆盖。

为了解决这些并发问题,MySQL 提供了不同的事务隔离级别,通过使用合适的隔离级别可以不同程度地避免上述问题:

  • 读未提交(READ UNCOMMITTED):允许脏读、不可重复读和幻读,隔离性最弱。
  • 读已提交(READ COMMITTED):避免脏读,但允许不可重复读和幻读。
  • 可重复读(REPEATABLE READ):MySQL InnoDB 引擎的默认隔离级别,避免脏读和不可重复读,但可能出现幻读。通过使用 Next-Key Locking 机制一定程度上缓解幻读问题。
  • 串行化(SERIALIZABLE):提供最高级别的隔离,完全避免脏读、不可重复读和幻读,但可能导致大量的锁竞争和较低的并发性能。

开发人员应根据应用程序的实际需求选择合适的隔离级别,并结合其他并发控制机制(如乐观锁、悲观锁、MVCC 等)来有效地处理事务并发问题,确保数据的一致性和完整性。在高并发场景下,还需要注意优化锁的使用,避免死锁的发生。

3.事务的隔离级别有哪些

事务的隔离级别是指数据库系统为事务提供的不同级别的数据访问和操作隔离机制,用于控制事务之间对数据的并发访问,防止因并发执行导致的数据不一致问题。在 MySQL 中,标准定义了以下四种事务隔离级别:

  1. 读未提交(Read Uncommitted)

    • 最低隔离级别,事务可以读取其他事务尚未提交的数据变更。
    • 问题:允许脏读(Dirty Read)、不可重复读(Non-repeatable Read)和幻读(Phantom Read)。
  2. 读已提交(Read Committed)

    • 事务只能读取其他事务已经提交的数据,即每次读取都基于最新的已提交版本。
    • 问题:避免了脏读,但仍然可能出现不可重复读和幻读。
  3. 可重复读(Repeatable Read)

    • MySQL InnoDB 引擎的默认隔离级别,在同一个事务内,多次读取同一数据时,始终返回最初查询时的数据版本,保证了在事务执行期间所读取的数据不会因其他事务的提交而改变。
    • 问题:避免了脏读和不可重复读,但仍然可能存在幻读。InnoDB 通过使用 Next-Key Locking 机制在一定程度上缓解幻读问题。
  4. 串行化(Serializable)

    • 最高隔离级别,提供完全的事务隔离,强制事务按照一定的顺序(串行)执行,如同单线程执行一样,完全避免了脏读、不可重复读和幻读问题。
    • 代价:牺牲了系统的并发性能,可能导致大量的锁等待和锁竞争,尤其是在高并发场景下。

总结来说,不同的事务隔离级别提供了不同级别的数据一致性保障,同时也伴随着不同程度的并发性能影响。选择合适的隔离级别需要根据具体的应用场景和对数据一致性的要求进行权衡。在实践中,大多数应用会选择使用“读已提交”或“可重复读”级别,既能在一定程度上保护数据一致性,又能保持一定的并发性能。而“串行化”级别通常只在对数据一致性有极其严格要求且可以接受较低并发性能的情况下使用。

4.什么是Next-Key Locking

Next-Key Locking 是 MySQL InnoDB 存储引擎在实现事务的可重复读(Repeatable Read)隔离级别时所采用的一种锁定机制,主要用于解决幻读(Phantom Read)问题。Next-Key Lock 是一种特殊的锁,它不仅锁定数据记录本身,还锁定记录所在的索引区间(即间隙),确保在事务执行期间,其他事务不能在这个范围内插入新的记录。

具体来说,Next-Key Lock 由两部分组成:

  1. Record Lock(记录锁):直接锁定索引记录,阻止其他事务对同一记录进行写操作。对于给定的索引键值,记录锁会锁定该键值对应的行。

  2. Gap Lock(间隙锁):锁定索引记录之间的间隙,阻止其他事务在该间隙内插入新的记录。即使间隙内目前没有实际数据,间隙锁也会对这个潜在的插入位置进行锁定。

当一个事务在可重复读隔离级别下执行 SELECT 查询时,InnoDB 会对查询涉及的所有索引记录及其前后的间隙(如果存在)施加 Next-Key Lock。这样,即使有其他事务在查询执行后插入满足相同查询条件的新记录,原事务在后续的同一查询中也无法看到这些“幻影”记录,从而实现了可重复读的隔离效果。

以下是一些关于 Next-Key Locking 的关键点:

  • 锁定范围:Next-Key Lock 会锁定一个“左开右闭”的区间,即从一个索引值(不包括)到下一个索引值(包括)。例如,对于索引值 (5, 10),Next-Key Lock 会锁定区间 (5, 10],包括索引值为 10 的记录以及其左侧的间隙。

  • 防止幻读:通过锁定查询条件所涉及的所有记录及其间隙,Next-Key Locking 确保了在同一事务中多次执行相同的查询,结果集始终保持不变,即使其他事务在查询之间插入了新的记录。

  • 事务结束释放:事务在提交或回滚时,会释放所有已获取的 Next-Key Lock。

  • 锁定行为:Next-Key Locking 仅在可重复读隔离级别下启用。在读未提交(Read Uncommitted)和读已提交(Read Committed)隔离级别下,InnoDB 不会使用 Next-Key Locking,而是使用较弱的锁定策略。

  • 锁升级:在某些情况下,如使用 SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE 显式锁定查询,或者在执行更新或删除操作时,InnoDB 可能会将 Next-Key Lock 升级为更严格的锁,如 Exclusive Lock。

  • 性能与并发:虽然 Next-Key Locking 有效地解决了幻读问题,但它可能导致更多的锁竞争和锁等待,特别是在涉及大量范围查询或索引间隙较大的情况下,可能对并发性能产生影响。

总的来说,Next-Key Locking 是 InnoDB 存储引擎在可重复读隔离级别下用来实现事务隔离性和防止幻读现象的一种重要锁定策略。通过结合记录锁和间隙锁,它确保了在一个事务的执行过程中,其他事务不能插入满足相同查询条件的新记录,从而维护了事务内部数据视图的一致性。

5.ACID 特性是如何实现的

ACID(Atomicity, Consistency, Isolation, Durability)是关系型数据库管理系统(RDBMS)在处理事务时必须遵循的一组核心特性,以确保数据的完整性和一致性。InnoDB 存储引擎作为 MySQL 中支持事务的主流引擎,通过以下技术手段实现了 ACID 特性:

1. 原子性(Atomicity)

实现方式

  • 事务日志(Redo Log):InnoDB 使用重做日志(redo log)记录事务对数据的修改操作。当事务提交时,先将修改操作写入重做日志,并确保其持久化到磁盘,然后再更新内存中的数据。如果在事务提交后发生系统崩溃,可以通过重放重做日志来恢复未写入数据文件的已提交事务,确保事务的原子性。
  • Undo Log:用于记录事务对数据的原始版本(或旧版本),在事务回滚时用于撤销已执行的修改。Undo Log 与 Redo Log 相配合,确保事务的修改能够原子地全部完成或全部撤销。

2. 一致性(Consistency)

实现方式

  • 事务隔离级别:通过设置适当的事务隔离级别(如可重复读、串行化等),限制不同事务间的读写交互,防止并发事务导致的数据不一致。
  • 约束检查:在事务提交前,数据库系统会进行完整性约束(如主键约束、外键约束、唯一性约束等)的检查,确保事务结束后的数据库状态满足一致性要求。
  • 触发器与存储过程:可以编写触发器或存储过程来执行复杂的业务规则验证,确保事务结束后数据符合业务逻辑的一致性。

3. 隔离性(Isolation)

实现方式

  • 锁机制:InnoDB 使用行锁、表锁、意向锁、Next-Key Locks 等锁机制来控制事务对数据的并发访问,防止脏读、不可重复读、幻读等问题。不同的隔离级别会采用不同强度的锁策略。
  • MVCC(多版本并发控制):在可重复读隔离级别下,InnoDB 使用 MVCC 来实现事务间的读写隔离。每个事务看到的是数据的一个快照版本,而不是最新的数据,从而避免了对其他未提交事务的干扰。

4. 持久性(Durability)

实现方式

  • 事务日志(Redo Log):如前所述,重做日志记录了事务对数据的物理修改,即使在事务提交后系统崩溃,也能通过重放日志恢复已提交事务的修改,确保数据的持久性。
  • Checkpoint:定期将Buffer Pool中的脏页(已修改但尚未写入磁盘的数据页)刷回磁盘,减少崩溃恢复时需要重放的日志量,加速恢复进程。
  • 双写缓冲(Double Write Buffer):为了避免在页写入过程中因系统崩溃导致页损坏,InnoDB 使用双写缓冲技术,先将页写入一个专用的连续区域(doublewrite buffer),然后再写入实际的数据文件,进一步增强了数据的持久性。

综上所述,InnoDB 存储引擎通过使用事务日志、锁机制、MVCC、完整性约束检查、触发器、存储过程以及特殊的内部机制(如双写缓冲、Checkpoint等),在软硬件层面共同协作,实现了对 ACID 特性的强有力支持。这些技术确保了即使在并发环境和系统故障条件下,数据库仍能保持数据的完整性和一致性,为用户提供了可靠的事务处理能力。

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

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

相关文章

Flask项目在Pycharm中设置局域网访问

打开PyCharm导入本应用。点击Run标签中的Edit Configurations 其中Target type选择Script path,Target填入本项目中app.py的路径,Additional optional填入--host0.0.0.0(不要有空格)。 再重新运行项目,会观察到除了原本的http://127.0.0.1:50…

上线流程及操作

上节回顾 1 搜索功能-前端:搜索框,搜索结果页面-后端:一种类型课程-APIResponse(actual_courseres.data.get(results),free_course[],light_course[])-搜索,如果数据量很大,直接使用mysql,效率非常低--》E…

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量…

FebHost:注册.CA域名的企业有什么限制?

在加拿大,只要满足加拿大互联网注册管理局的“加拿大注册要求”,任何类型的企业都可以注册.CA域名。这些要求的目的是为了确保.CA域名空间作为一个重要的公共资源得到合理的使用和开发,以促进所有加拿大人的社会和经济发展。 以下是一些主要…

0418WeCross搭建 + Caliper测试TPS

1. 基本信息 虚拟机名称:Pure-Ununtu18.04 WeCross位置:/root/wecross-demo 2. 搭建并启动WeCross 参考官方指导文档 https://wecross.readthedocs.io/zh-cn/v1.2.0/docs/tutorial/demo/demo.html 访问WeCross网页管理平台 http://localhost:8250/s/…

嵌入式科普(15)小米su7成本分析和拆解之智驶、座舱分析

目录 一、概述 二、小米su7成本分析 2.1 整车成本构成 2.2 三电系统 2.3 车身与底盘 2.3 智能网联 2.4 内外饰 三、小米su7拆解之智驶、座舱分析 3.1 主要芯片 3.2 智能驾驶&智能座舱 四、NXP S32K324汽车通用微控制器 嵌入式科普(15)小米su7成本分析和拆解之智…

问答营销之官方号问答推广技巧

问答营销作为一种网络推广的重要手段,受到各大品牌企业的关注。实战中,问答营销有新起提问再回答和直接回复老问题两种形式,一般做企业官方号问答营销都是选择后者。这里小马识途营销顾问详细解析下开展老问题回复营销的思路和步骤。 一、分析…

2024最新大厂C++面试真题合集,玩转互联网公司面试!

小米C 1. 进程和线程的区别 进程是操作系统分配资源和调度的独立单位,拥有自己的地址空间和系统资源。线程是进程内部的执行单元,共享属于相同进程的资源,但是执行切换代价更小。进程间相互独立,稳定性较高;线程间共…

C++修炼之路之反向迭代器和非模板参数,模板特化,分离编译

目录 前言 一:反向迭代器 二:非类型模板参数 三:模板的特化 四:模板的分离编译 五:模板的优点与缺点 接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 前言 在vector&am…

代码随想录第40天|343. 整数拆分

343. 整数拆分 343. 整数拆分 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili 给定一个正整数 n ,将其拆分为 k 个 正…

2024-4-18 群讨论:Java Agent,JFR 与 JIT 的一些讨论

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号:hashcon,私信进群拉你 命令行中带 -XX:StartFlightRecording 启动,同时带 -javaagent,那么谁先启动?jfr能采集到agent启动前后资源消耗情况不? 不…

基于深度学习的手写汉字识别系统(含PyQt+代码+训练数据集)

基于深度学习的手写汉字识别系统(含PyQt代码训练数据集) 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现参考资料 前言 本项目是基于深度学习网络模型的人脸表情识别系统&#xff0…

c++编程(6)——类与对象(4)运算符重载、赋值重载函数

欢迎来到博主的专栏——C编程 博主ID:代码小豪 文章目录 运算符重载赋值重载函数默认赋值重载函数其他运算符重载函数 运算符重载 重载这个概念在c中已经出现两次了,在前面的文章中,函数重载指的是可以用相同名字的函数实现不同的功能。而运…

【WebSocket连接异常】前端使用WebSocket子协议传递token时,Java后端的正确打开方式!!!

文章目录 1. 背景2. 代码实现和异常发现3. 解决异常3.1 从 URL入手3.2 从 WebSocket子协议的使用方式入手(真正原因) 4. 总结(仍然存在的问题) 前言: 本篇文章记录的是使用WebSocket进行双向通信时踩过的坑&#xff0c…

将gdip-yolo集成到yolov9模型项目中(支持预训练的yolov9模型)

1、yolov9模型概述 1.1 yolov9 YOLOv9意味着实时目标检测的重大进步,引入了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)等开创性技术。该模型在效率、准确性和适应性方面取得了显著改进,在MS COCO数…

「 安全工具介绍 」软件成分分析工具Black Duck,业界排名TOP 1的SCA工具

在现代的 DevOps 或 DevSecOps 环境中,SCA 激发了“左移”范式的采用。提早进行持续的 SCA 测试,使开发人员和安全团队能够在不影响安全性和质量的情况下提高生产力。前期在博文《「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到…

Qt-饼图示范

1.效果图 2.代码如下 2.1 .h文件 #ifndef PIECHARTWIDGET_H #define PIECHARTWIDGET_H#include <QWidget> #include <QChartView> #include <QPieSeries>#include<QVBoxLayout> #include<QMessageBox> #include <QtCharts>struct PieDat…

FastAPI - uvicorn设置 logger 日志格式

怎么将日志打印到文件 在main.py加入log_config“./uvicorn_config.json” import uvicornif __name__ "__main__":uvicorn.run("app:app", host"0.0.0.0", port8000, log_config"./uvicorn_config.json")uvicorn_config.json {&qu…

“互联网+”创意创业大赛活动方案

大赛历时6个月&#xff0c;总体分两个赛程&#xff1a;一是策划创意阶段。评审的是方案。二是组织实施阶段。通过阶段一立项的项目由公司协助实施&#xff0c;最终评审的是项目落实情况。学生可两个赛程单独参加&#xff0c;也可连续参加。 具体流程及时间安排如下&#xff1a;…

ansible-tower连接git实现简单执行playbook

前提&#xff1a;安装好ansible-tower和git&#xff0c;其中git存放ansible得剧本 其中git中得内容为&#xff1a; --- - name: yjxtesthosts: yinremote_user: rootgather_facts: noroles:- testroles/test/tasks/main.yml #文件内容 --- #- name: Perform Test Task # tas…
最新文章