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 串行化: 所有事务在服务器上都是一个一个执行,解决脏读,不可重复读和幻读问题,并发程度最低,隔离性最高,执行速度最慢,数据最准确
相关推荐
Tiandaren3 小时前
Selenium 4 教程:自动化 WebDriver 管理与 Cookie 提取 || 用于解决chromedriver版本不匹配问题
selenium·测试工具·算法·自动化
胚芽鞘6813 小时前
关于java项目中maven的理解
java·数据库·maven
nbsaas-boot4 小时前
Java 正则表达式白皮书:语法详解、工程实践与常用表达式库
开发语言·python·mysql
岁忧4 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
chao_7894 小时前
二分查找篇——搜索旋转排序数组【LeetCode】两次二分查找
开发语言·数据结构·python·算法·leetcode
CJi0NG4 小时前
【自用】JavaSE--算法、正则表达式、异常
java
风无雨5 小时前
GO 启动 简单服务
开发语言·后端·golang
Hellyc5 小时前
用户查询优惠券之缓存击穿
java·redis·缓存
斯普信专业组5 小时前
Go语言包管理完全指南:从基础到最佳实践
开发语言·后端·golang
今天又在摸鱼5 小时前
Maven
java·maven