Java面试题之MySQL事务详解

事务是什么

MySQL中的事务(Transaction)是数据库管理系统执行的一个逻辑操作单元,它是由一系列数据库操作组成的逻辑工作单元。事务是并发控制的单位,也是用户定义的一个操作序列。事务的主要目的是确保数据的完整性和一致性,防止多个用户同时对数据库进行修改时产生的数据不一致问题,例如脏读、不可重复读和幻读。

MySQL事务的四大特性

事务的四大特性ACID是数据库管理系统在处理事务时候重要的原则,他们保证了数据的完整性和一致性,其中包括

1.原子性(Atomicity)

  1. 事务被视为一个不可分割的工作单位其中的操作要么全都完成,要么全都不完成,
  2. 如果事务在执行过程中因为某些原因被中断(如系统崩溃),那么已执行的操作会被撤销,这里称为"回滚",数据库将事务回滚到开始前的状态,好像什么都没有发生
  3. 可以理解为转账,要么我掏钱,钱过去了,要么我没掏钱,钱没过去,不会有我掏钱,钱也没过去的状态

2.一致性(Consistency)

  1. 事务必须是数据库从一个一致性状态变换到另一个一致性状态
  2. 一致性确保了事务在开始和结束时,数据库完整性的约束不会被破坏,
  3. 可以理解为一个账户给另一个账户转账,无论是否成功两个账户相加的总额都不会变

3.持久性(Durabiliy)

  1. 事务执行完毕后会修改硬盘上的数据,事务都是会持久生效的,
  2. 通常事务的提交会伴随日志的记录,就算系统故障也可以通过日志恢复到事务提交后的状态
  3. 理解为转账成功后,在没有转账情况下,你的金额是持久不变的

4.隔离性(lsolation)

  1. 多个事务并发执行,一个事务的执行不会影响其他事务,
  2. 隔离性通过锁或者其他并发控制技术实现,以确保事务提交钱对其他事务是不可见的
  3. 理解为相互转账,其他事务是不能干预的

并发事务可能会带来的问题

  • 脏读:当事物正在访问数据并且对数据进行了修改,而这种修改还没到数据库中时,另一个事务也访问了这个数据,并使用的了这个"脏数据",因为这个数据还没有被提交,所以基于"脏数据"所做的操作可能是不正确的
  • 不可重复读:一个事务内多次读取同提个事务,如果这个事务还没结束时另一个事务修改了这个数据,那么这个事务中的两次读取数据之间,由于修改两次读取的数据可能不一致
  • 幻读:一个事务读取几行数据后,另一个并发事务插入了一些数据,在随后查询过程中第一个事务就会发现多了一些原本不存在的记录,好像出现了幻觉

怎么解决并发事务带来的问题

MySQL中提供四个隔离级别,设置不同的隔离级别使事务之间并发执行的影响产生不同的差别,从而不同程度解决并发事务带来的影响

  1. read uncommitted 读未提交: 这种情况下,一个事务可以读取另一个事务未提交的数据,可能会产生脏读,不可重复读,幻读三责天,但是此时并发执行程度最高,意味着执行速度更快,例如抖音点赞几百万的这种后面几位可以直接省去,不用准确
  2. read committed 读已提交: 这种情况下,一个事务只能读取另一个事务提交的数据(给写操作加锁了),可能会产生不可重复读,幻读问题(脏读问题已经解决),此时并发程度降低,执行速度变慢,同事也称为事务之间隔离性提高了,事务之间相互影响变小,数据的准确性提高了
  3. repeatable read 可重复读: 这种情况下,相当于是给写操作和读操作都加锁了,此时可能会产生幻读问题,解决了脏读和不可重复读问题,并发程度进一步降低,执行速度进一步变慢,事务之间隔离性提高,数据准确性再次提高
  4. serializable 串行化: 所有事务在服务器上都是一个一个执行,解决脏读,不可重复读和幻读问题,并发程度最低,隔离性最高,执行速度最慢,数据最准确

 

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

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

相关文章

Trying to access array offset on value of type null

主要原因是版本7.4以后PHP解析器会对null类型的下标访问直接报错 背景: laravel框架 同时使用了扩展A和扩展B 扩展A要求 php>7.4,同时扩展B的对null类型的下标访问不兼容php7.4 修改扩展B不太现实,毕竟扩展B中有太多的对null类型的下标访问。 解决…

SQL Server中CROSS APPLY连接操作

在 SQL Server 中,CROSS APPLY 是一个连接操作,它类似于 INNER JOIN,但有一些关键差异,特别是在处理表值函数(TVF)、行集函数或子查询时。CROSS APPLY 返回对于外部查询中的每一行,在内部查询或…

osi七层网络模型安全加固

应用层加固 应用层的攻击: 1、针对应用层协议的攻击:HTTP攻击、DNS攻击、电子邮件攻击等,利用应用层协议的漏洞,构造恶意数据包,是目标服务器执行恶意代码或暴露敏感信息 HTTP攻击:XSS、CSRF、HTTP头注入…

如何让AI 帮你生成 git 提交信息

在协同开发的项目中,我们肯定避免不了使用git提交代码,所以经常会看到了一些描述不清的提交信息。当遇到种情况时,我们也不必为此责怪开发人员,因为我们确实很难记住你在 git 提交时刚刚做了什么。 Nutlope / aicommits 一个使用 …

高速公路视频监控系统与车牌抓拍:EasyCVR视频监控技术助力交通道路安全监控

随着科技的不断发展,高速公路视频监控与车牌抓拍系统作为智能交通的重要组成部分,日益发挥着不可或缺的作用。这些先进的技术不仅提高了道路交通的管理效率,也为保障行车安全提供了新的手段。 高速公路视频监控系统的应用,极大地…

Spring-事件

Java 事件/监听器编程模型 设计模式-观察者模式的拓展 可观察者对象(消息发送者) Java.util.Observalbe观察者 java.util.Observer 标准化接口(标记接口) 事件对象 java.util.EventObject事件监听器 java.util.EventListener public class ObserverDemo {public static vo…

如何在招聘中开始使用AI?

在人工智能时代,招聘团队面临着“用更少的钱做更多的事情”的压力:用更少的钱和更少的团队。根据一项调查,58%的受访者认为,“提高我们助教团队的效率,降低成本”是明年招聘职位的首要任务。在招聘中使用人工智能是提高…

40、基于深度学习的线性预测设计(matlab)

1、原理及流程 深度学习的线性预测是一种利用深度神经网络模型进行线性回归预测的方法。其设计原理主要基于神经网络的层次化特性,利用多层感知器(MLP)等模型进行特征学习和非线性变换,从而提高线性预测的准确性。 设计流程如下…

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch0 一张图讲完强化学习原理

PPT 截取有用信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、相应章节 过电子书 [2023.8 版本] 复习 3、总体 MOOC 过一遍 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链接 PPT和书籍下载网址: 【github链接】 onedrive链接&…

原子阿波罗STM32F767程序的控制器改为STM32F407驱动LCD屏

由于手里没有原子大神的F429开发板,又还想学习原子大神的F429开发板程序,前几天,经过更换控制器,成功把原子大神的F429开发板程序用到了F407开发板上,驱动LCD屏显示成功,目的,就是熟悉原子大神的…

记录第一次突发情况

项目场景: 这台云服务器主要是我学习在用,也不是很大,2核2g3M40G硬盘。 在这台服务器上,我主要使用了docker并且把所有的东西,都通过docker安装,比如MySQL,redis, elasticsearch。 …

安装 Nuxt.js 的步骤和注意事项

title: 安装 Nuxt.js 的步骤和注意事项 date: 2024/6/17 updated: 2024/6/17 author: cmdragon excerpt: Nuxt.js在Vue.js基础上提供的服务器端渲染框架优势,包括提高开发效率、代码维护性和应用性能。指南详细说明了从环境准备、Nuxt.js安装配置到进阶部署技巧&…

生成式人工智能备案办理指南,深度解析大模型备案全流程

早在2023年年初,国家互联网信息办公室、工业和信息化部、公安部针对深度合成服务制定的《互联网信息服务深度合成管理规定》(“《深度合成管理规定》”)顺利施行,其明确了深度合成服务相关方的义务与主体责任,强化了对…

RERCS系统开发实战案例-Part06 FPM Application添加列表组件(List UIBB)

在FPM Application中添加搜索结果的List UIBB 1)添加List UIBB 2)提示配置标识不存在,则需要新建配置标识(* 每个组件都必须有对应的配置标识); 3)选择对应的包和请求 4)为List UIB…

一键掌控,4G红外插座引领智能生活新潮流!

随着科技的进步,市场上出现大量带语音、手机APP可控制的智能插座产品,由此可看出客户对产品的功能要求也越来越高,追求舒适的体验感,特别是对操控性的要求越来越高。但是目前大部分红外遥控插座均为WiFi插座类型,WiFi红…

【一步一步了解Java系列】:认识String类

看到这句话的时候证明:此刻你我都在努力 加油陌生人 个人主页:Gu Gu Study专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者:小闭…

Java异常和文件

一、异常 1.定义 异常:异常就是代表程序出现的问题 体系结构: 最上层的是 Throwable 类,下面有两个子类: ① Error:代表系统级别的问题(属于严重问题,比如:内存溢出)。…

企业该怎么进行流程管理?

众所周知,流程管理在企业中是一种有效的方法,可以帮助组织优化运营、提高效率并降低成本。 下面是一些步骤,可以帮助大家在企业中实施流程管理: 确定目标:首先,明确企业的目标和愿景。这将帮助您确定需要…

Python画箱线图展示数据分布情况

箱线图(Boxplot)是一种常用的统计图表,用于展示数据的分布情况。 它由五个统计量组成:最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)和最大值。 …

ffmpeg封装和解封装介绍-(10)综合完成视频重编码为h265,解封装解码编码再封装

主函数逐句解析: 由于代码太多我们只解析主函数,(其他封装函数见前面文章,同时用到了解码编码封装代码)。 初始化和参数处理 int main(int argc, char* argv[]) {/// 输入参数处理string useage "124_test_x…