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 串行化: 所有事务在服务器上都是一个一个执行,解决脏读,不可重复读和幻读问题,并发程度最低,隔离性最高,执行速度最慢,数据最准确
相关推荐
小江的记录本8 分钟前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小马爱打代码40 分钟前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理
java·后端·spring
deepin_sir41 分钟前
10 - 函数
开发语言·python
better_liang44 分钟前
每日Java面试场景题知识点之-SpringBoot启动流程
java·面试·springboot·源码解析·启动流程
RyFit1 小时前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring
z落落1 小时前
C#String字符串
开发语言·c#·php
handler011 小时前
【MySQL】常用命令总结(库与表增删查改)
运维·数据库·mysql·命令·总结
猫头虎-前端技术1 小时前
JS 作用域与闭包:从变量提升到闭包陷阱的超详细解析
开发语言·javascript·云计算·bootstrap·ecmascript·openstack·perl
week@eight1 小时前
Linux - Doris
linux·运维·数据库·mysql
云泽8081 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算