【Mysql事务】

目录

前言

1.事务的特性是什么?可以详细说一下吗?

2.并发事务带来哪些问题?怎么解决这些问题呢?Mysql的默认隔离级别是?

3.undo log和redo log的区别。

4.事务中的隔离性是如何保证的(解释一下MVCC)?

5.主从同步原理。

6.项目用过分库分表吗?

总结


前言

本文主要介绍了Mysql事务面试题相关的面试题目。


1.事务的特性是什么?可以详细说一下吗?

  • 原子性(Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

参考回答:ACID,分别指的是:原子性、一致性、隔离性、持久性。举个例子:A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要么都成功,要么都失败。在转账的过程中,数据要一致,A扣除了500,B必须增加500。在转账的过程中,隔离性体现在A向B转账,不能受其他事务干扰。在转账的过程中,持久性体现在事务提交后,要把数据持久化(可以说是落盘操作)。

2.并发事务带来哪些问题?怎么解决这些问题呢?Mysql的默认隔离级别是?

并发事务的问题:

  • 脏读:一个事务读到另外一个事务还没有提交的数据。
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同。
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”。

隔离级别和问题:

  • Read uncommitted   未提交读           脏读、不可重复读、幻读
  • Read committed  读已提交                 不可重复读、幻读
  • Repeatable read  可重复读                  幻读
  • Serializable   串行化

参考回答:

       在项目开发中,多个事务并发进行是经常发生的,并发也是必然的,有可能导致一些问题:第一是脏读,当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是”脏数据”,依据”脏数据”所做的操作可能是不正确的;第二是不可重复读,比如在一个事务内多次读同一数据,在这个事务还没有结束时,另一个事务也访问该数据,那么在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次谈取的数据可能不太一样,这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读;第三是幻读,幻读与不可重复读类似,它发生在一个事务(T1) 读取了几行数据接着另一个并发事务(T2)插入了一些数据时,在随后的查询中,第一个事务(T1)就会发现多了些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

        解决这些问题的解决方案是对事务进行隔离,Mysql支持四种隔离级别,分别有:第一个是未提交读,它解决不了刚才提出的所有问题,一般项目中也不用这个;第二个是读已提交,它能解决脏读的问题的,但是解决不了不可重复读和幻读;第三个是可重复读,它能解决脏读和不可重复读,但是解决不了幻读,这个也是Mysql默认的隔离级别;第四个是串行化,它可以解决刚才提出来的所有问题,但是由于让是事务串行执行的,性能比较低。所以我们一般使用的都是Mysql默认的隔离级别:可重复读。

3.undo log和redo log的区别。

  • redo log:记录的是数据页的物理变化,服务宕机可用来同步数据。
  • undo log:记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据。
  • redo log保证了事务的持久性,undo log保证了事务的原子性和一致性。

参考回答:其中redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据,而undo log不同,它主要记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据,比如我们删除一条数据的时候,就会在undo log日志文件中新增一条delete语句,如果发生回滚就执行逆操作。redo log保证了事务的持久性,undo log保证了事务的原子性和一致性。

4.事务中的隔离性是如何保证的(解释一下MVCC)?

Mysql中的多版本并发控制,指维护一个数据的多个版本,使得读写操作没有冲突。

隐藏字段:

  • trx_id(事务id),记录每一次操作的事务id,是自增的。
  • roll_pointer(回滚指针),指向上一个版本的事务版本记录地址。

undo log:

  • 回滚日志,存储老版本数据。
  • 版本链:多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表

readView解决的是一个事务查询选择版本的问题:

  • 根据readView的匹配规则和当前的一些事务id判断该访问那个版本的数据。
  • 不同的隔离级别快照读是不一样的,最终的访问的结果不一样。
  • RC:每一次执行快照读时生成ReadView。
  • RR:仅在事务中第一次执行快照读时生成ReadView,后续复用。

参考回答:事务的隔离性是由锁和mvcc实现的。其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段,第二个是undo log日志,第三个是readView读视图。隐藏字段是指:在Mysql中给每个表都设置了隐藏字段,有一个是trx_id(事务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回滚指针),指向上一个版本的事务版本记录地址。undo log主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表。readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生成ReadView,后续复用。

5.主从同步原理。

Mysql主从复制的核心就是二进制日志binlog(DDL(数据定义语言)语句和 DML(数据操纵语言)语句)。

  • 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
  • 从库读取主库的二进制日志文件 Binlog,写入到从库的中继日志 Relay Log。
  • 从库重做中继日志中的事件,将改变反映它自己的数据。

参考回答:Mysql主从复制的核心就是二进制日志,二进制日志记录了所有的DDL语句和DML语句。具体的主从同步过程大概的流程是这样的:

  1. Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
  2. 从库读取主库的二进制日志文件 Binlog,写入到从库的中继日志 Relay Log。
  3. slave重做中继日志中的事件,将改变反映它自己的数据。

6.项目用过分库分表吗?

业务介绍:

  • 根据自己简历上的项目,想一个数据量较大的业务(请求数多或业务累积大)。
  • 达到了什么样的量级(单表1000万或超过20G)。

具体拆分策略:

  • 水平分库,将一个库的数据拆分到多个库中,解决海量数据存储和高并发的问题(sharding-sphere、mycat)。
  • 水平分表,解决单表存储和性能的问题(sharding-sphere、mycat)。
  • 垂直分库,根据业务进行拆分,高并发下提高磁盘IO和网络连接数。
  • 垂直分表,冷热数据分离,多表互不影响。


总结

本文主要介绍了Mysql事务面试题相关的面试题目。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql制作数据表

一.注意: 1.(Mysql尽量用大写, 2.结尾为‘;’, 3.‘’与“”效果一样, 4.数据表名称显示时定为小写, 5.很多人教的时候喜欢用英文,我觉得麻烦,于是我用中文举例&…

moduleID的使用

整个平台上有很多相同的功能,但是需要不同的内容。例如各个模块自己的首页上有滚动新闻、有友好链接等等。为了公用这些功能,平台引入了moduleID的解决方案。 在前端的配置文件中,配置了模块号: 前端页面请求滚动新闻时&#xff0…

微软AD域替代方案,助力企业摆脱hw期间被攻击的窘境

在红蓝攻防演练(hw行动)中,AD域若被攻击成功,是其中一个扣分最多的一项内容。每年,宁盾都会接到大量AD在hw期间被攻击,甚至是被打穿的企业客户。过去,企业还会借助2FA双因子认证加强OA、Exchang…

LeetCode力扣 面试经典150题 详细题解 (1~5) 持续更新中

目录 1.合并两个有序数组 2.移动元素 3.删除有序数组中的重复项 4.删除排序数组中的重复项 II 暂时更新到这里,博主会持续更新的 1.合并两个有序数组 题目(难度:简单): 给你两个按 非递减顺序 排列的整数数组 num…

ChatGPT高效提问—prompt常见用法(续篇七)

ChatGPT高效提问—prompt常见用法(续篇七) 1.1 零样本、单样本和多样本 ​ ChatGPT拥有令人惊叹的功能和能力,允许用户自由向其提问,无须提供任何具体的示例样本,就可以获得精准的回答。这种特性被称为零样本&#x…

Python编写远程控制工具--被控端的编写

本节将开始着手用Python编写远程控制工具。因篇幅限制,这里主要编写两 个常用的功能:命令执行和文件传输。当然,好的远程控制工具的功能远远不只 这些,读者可以在此基础上增加新的功能。具体步骤如下。 1)编写主函数并…

每日一题——LeetCode1417.重新格式化字符串

方法一 个人方法: s里的字符只有小写字母和数字两种情况,我们可以把s里的字母和数字分隔成两个字符串, 比较两个字符串的长度,只有当两个字符串的长度差值的绝对值为1或0才能满足题意。 长度更长的要放在结果字符串的第一位&am…

写一个python基于线程池的多线程

下面是一个示例程序,它使用Python的concurrent.futures模块中的线程池来实现多线程操作: import concurrent.futuresdef worker(arg):print(fWorking on {arg})return arg * 2if __name__ __main__:# 创建线程池with concurrent.futures.ThreadPoolExe…

嵌入式学习之Linux入门篇笔记——18,makefile基本语法(下)

配套视频学习链接:http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.wildcard 函数 格式:$(wildcard PAT…

SQL如何实现数据表行转列、列转行?

SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集。本文将介绍在SQL中如何实现数据表地行转列、列转行操作,以及实际应用示例。 这里通过表下面三张表进行举例 SQL创建数据库和数据表 数据表示例数据分别如下: data_…

数据湖的整体思路

湖本质上是一个集中化,中心化的,一体化的存储技术,并且在其之上追求技术架构的统一化,如流批一体,服务分析一体化。 当数据湖成为中心,那么就可以围湖而建“数据服务环”,环上的服务包括了数仓、…

鸿蒙开发(六)布局概述

迄今为止,我还没有正式提到布局的概念。但其实我之前的demo里面,已经默认使用到了一种布局,那就是线性布局(Row、Column),这也是DevEco创建项目默认页面里面默认采用的布局。那么本篇,带着大家一…

微服务介绍、使用 Nacos 实现远程调用以及 OpenFeign 的使用

1 微服务的概念 区别于单体项目 单体项目拆分成微服务项目的目标:高内聚、低耦合 拆分思路 纵向拆分:根据功能模块 横向拆分:抽取可复用模块 2 微服务拆分——远程调用 背景:微服务单一职责,每个服务只有自己的功能…

[PYthon] 字典

如题,这篇博客将带大家来学习Python中的字典~ 那么,是我们想象中的那种字典嘛?接下来跟着可莉去一探究竟吧~ 可莉将这篇文章收录在了:《Python》 可莉推荐的优质博主主页:Keve ’ s blog Python 中的字典(D…

-转换流-

它是字节流和字符流之间转换的桥梁 转换流本身其实是字符流; 转换流的位置: 分为两个:字符转换输入流:InputStreamReader将InputStream转换为Reader字符转换输出流:OutputStreamWriter将Writer转换为OutputStream 作用…

4.2 Verilog 过程赋值

关键词:阻塞赋值,非阻塞赋值,并行 过程性赋值是在 initial 或 always 语句块里的赋值,赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后,其值将保持不变,直到重新被赋予新值。 连续性赋值总是处…

C++ 11新特性之可变参数模板

概述 随着C 11标准的发布,C语言获得了许多强大的新特性,其中一项显著提升灵活性和实用性的创新便是可变参数模板。这一特性极大地扩展了模板在处理不定数量类型或值参数时的能力,为开发者提供了更为强大且灵活的泛型编程工具。 工作机制 在C …

LeetCode Python - 6.Z字形变换

文章目录 题目答案运行结果 题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你的输…

Qualcomm 蓝牙耳机 FAQ(41)---------Audio 问题分析之 ACAT Tools安装

大家好! 新的一年,在此祝大家:新年快乐!工作上步步高升!!龙年大吉!!! 也欢迎大家登录大大通平台,春节期间正常更新文章,期待你的到来&#xff0…

语义分割任务的准确率计算:基于PyTorch实现

语义分割任务的准确率计算:基于PyTorch实现 🌵文章目录🌵 🌳引言🌳🌳语义分割任务概述🌳🌳准确率的定义与计算方法🌳🌳实践应用与优化策略🌳&…