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 串行化: 所有事务在服务器上都是一个一个执行,解决脏读,不可重复读和幻读问题,并发程度最低,隔离性最高,执行速度最慢,数据最准确
相关推荐
不是万能的豆学长5 小时前
filetidy 文件整理助手:一键归类 + 规范重命名(Python 零依赖单文件工具)
大数据·开发语言·python·技术美术
时间静止不是简史5 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428049 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
懂点Tech10 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
徐小夕10 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao10 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
金銀銅鐵11 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
catchadmin11 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
福建佰胜张工11 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
念何架构之路11 小时前
go-grpc设计思想
开发语言·后端·golang