秋招后端开发面试题 - MySQL事务

发布于:2024-05-07 ⋅ 阅读:(26) ⋅ 点赞:(0)


MySQL事务

前言

已经找到工作了,分享秋招时的笔记。祝大家都能顺利找到自己心仪的工作。


面试题

什么是数据库事务

事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行

为什么要有事务呢?

  • 保证数据的最终一致性

项目中遇到的事务

  • 下单减库存

事务的传播机制

事务的特性?

ACID

  • 原子性: 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行
  • 一致性: 指在事务开始之前和事务结束以后,数据不会被破坏
  • 隔离性: 多个事务并发访问时,事务之间是相互隔离
  • 持久性: 表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中

事务并发存在的问题

事务并发会引起脏读、不可重复读、幻读问题。

  • 脏读:一个事务读取到了另一个未提交事务修改过的数据
  • 不可重复读:同一个事务内,前后多次读取,读取到的数据内容不一致
  • 幻读:如果一个事务先根据某些搜索条件查询出一些记录,在该事务未提交时,另一个事务写入了记录,导致两次读取到的数据内容不一致

四大隔离级别

  • 读未提交: 只限制了两个数据不能同时修改,但是修改数据的时候,即使事务未提交,可以被别的事务读取到
  • 读已提交: 当前事务只能读取到其他事务提交的数据
  • 可重复读: 限制了读取数据的时候,不可以进行修改
  • 串行化: 事务最高的隔离级别,所有事务都是进行串行化顺序执行的

四大隔离级别,都会存在哪些并发问题呢

  • 读未提交:脏读、不可重复读、幻读
  • 读已提交:不可重复读、幻读
  • 可重复读:幻读
  • 串行化:无

数据库是如何保证事务的隔离性的呢?

  • 数据库是通过加锁,来实现事务的隔离性的
  • 比如串行化隔离级别就是加锁实现的,但是频繁的加锁,导致读数据时,没办法修改,修改数据时,没办法读取,大大降低了数据库性能

如何解决加锁后的性能问题的?

使用MVCC 多版本并发控制

并发事务有什么什么问题?应该如何解决?

并发事务可能造成:脏读、不可重复读和幻读等问题 ,这些问题其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决

  • 加锁:在读取数据前,对其加锁,阻止其他事务对数据进行修改
  • 提供数据多版本并发控制(MVCC),也称为多版本数据库:不用加任何锁, 通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot), 并用这个快照来提供一定级别的一致性读取,从用户的角度来看,好像是数据库可以提供同一数据的多个版本

MySQL 事务实现原理是什么?

以 InnoDB 的事务实现为例

  • InnoDB 是通过MVCC解决不可重复读问题
  • 间隙锁解决幻读问题
  • 事务的隔离性是通过实现
  • 而事务的原子性、一致性和持久性则是通过事务日志实现

事务的两阶段提交协议

  • 开启 binlog 的情况下,为了保证 binlog 与 redo log 的一致性,MySQL 将采用事务的两阶段提交协议
  • 当 MySQL 系统发生崩溃时,事务在存储引擎内部的状态可能为准备状态和提交状态两种
  • 对于准备状态的事务,是进行提交操作还是进行回滚操作,需要参考 binlog
    • 如果事务在 binlog 中存在,那么将其提交
    • 如果不在 binlog 中存在,回滚

秋招后端开发面试题系列目录
一、Java
1.1 Java基础上
1.2 Java基础下
1.3 Java集合
1.4 JavaIO
1.5 Java多线程上
1.6Java多线程下
二、JVM
2.1 JVM底层原理
2.2 垃圾回收器
2.3 垃圾回收算法
2.4 类加载机制
2.5 运行时数据区
三、MySQL
3.1 MySQL基础
3.2 事务
3.3 索引
3.4 锁机制
3.5 MVCC
四、Redis
4.1 Redis基础
4.2 缓存原理
五、中间件
5.1 RabbitMQ
六、Spring开源框架
6.1 Spring
6.2 Spring MVC
6.3 Spring Boot
6.4 MyBatis
七、操作系统
八、计算机网络
九、设计模式
十、微服务架构
十一、Spring Cloud分布式
11.1 分布式基础
11.2 Spring Cloud
11.3 GateWay
11.4 Nacos
11.5 OpenFeign
11.6 Ribbon
十二、算法
十三、项目