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 串行化: 所有事务在服务器上都是一个一个执行,解决脏读,不可重复读和幻读问题,并发程度最低,隔离性最高,执行速度最慢,数据最准确
相关推荐
2501_9418059317 小时前
在大阪智能零售场景中构建支付实时处理与高并发顾客行为分析平台的工程设计实践经验分享
数据库
你怎么知道我是队长17 小时前
C语言---枚举变量
c语言·开发语言
李慕婉学姐17 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫17 小时前
quecpython中&的具体含义和使用场景
开发语言·python
珠海西格电力17 小时前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
じ☆冷颜〃17 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
云栖梦泽17 小时前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
哈里谢顿17 小时前
记录一次sql优化记录
mysql
数据大魔方17 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
POLITE317 小时前
Leetcode 23. 合并 K 个升序链表 (Day 12)
算法·leetcode·链表