mysql面试题——事务相关

一:什么是数据库事务?

一组逻辑操作单元,使数据从一种状态变换到另一种状态。这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

二:什么是脏写、脏读、幻读、不可重复读?

脏写:如果事务A 修改了另一个未提交事务B 修改过的数据,如果事务A修改提交了,事务B回滚了,数据又回到原来状态了。
脏读:读到了其他事务还没有提交的数据,如果其他事务因某种原因撤销对该值的修改,这就导致所读取到的数据是无效的。
不可重复读:对某数据进行读取过程中,有其他事务对数据进行了修改(UPDATE、DELETE),导致第二次读取的结果不同
幻读:事务在做范围查询过程中,另外一个事务对范围内新增了记录(INSERT),导致范围查询的结果条数不一致。

三:MySQL中的事务隔离级别?

读未提交:一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在脏读 、不可重复读和幻读的问题。
读已提交:在一个事务修改数据过程中,如果事务还没提交,其他事务不能读该数据。所以,这种隔离级别是可以避免脏读的发生的
可重复读:事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容
可串行化:确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作

四:InnoDB如何解决脏读、不可重复读和幻读的?

在Innodb中,通过MVCC解决脏读和不可重复读,通过MVCC+间隙锁解决幻读的。
脏读的解决:InnoDB 通过在每行数据中添加一个隐藏的事务 ID 来实现 MVCC,当一个事务开始时,它会获取一个唯一的事务ID,该事务 ID 被用来标记该事务所做的修改。当一个事务读取一行数据时,InnoDB 检查该行数据的事务 ID 是否小于当前事务的ID,只有小于当前事务ID才是已提交的数据。否则,说明该行数据是未提交的数据,InnoDB 将阻止该事务读取该行数据,从而避免了脏读的问题。
不可重读的解决:InnoDB 通过使用 MVCC 来解决不可重复读的问题。在RR这种隔离级别下,当我们使用快照读进行数据读取的时候,只会在第一次读取的时候生成一个Read View,后续的所有快照读都是用的同一个快照,所以就不会发生不可重复读的问题了。
幻读的解决:InnoDB的RR级别中,基于MVCC+间隙锁,是在某种程度上是可以避免幻读的发生的,但是没有办法完全避免,当一个事务中发生当前读的时候,会导致幻读的发生

五:为什么MySQL默认使用RR隔离级别?

六:为什么默认RR,大厂要改成RC?

虽然RR的隔离级别可以在一定程度上避免脏读、不可重复读和幻读等问题,但是,对于很多大型的互联网来说,会愿意将数据库的默认隔离级别调整成并发度更高的RC级别,从而,提升并发度并且降低发生死锁的概率。

七:Innodb的RR到底有没有解决幻读?

InnoDB中的RR这种隔离级别通过MVCC+临键锁解决了大部分的幻读问题,但是并不是所有幻读都能解决,想要彻底解决幻读,需要使用可串行化的隔离级别。
RR中,通过MVCC机制,解决了快照读的幻读问题,RR中的快照读只有第一次会进行数据查询,后面都是直接读取快照,所以不会发生幻读。通过间隙锁解决了部分当前读的幻读问题,通过增加间隙锁将记录之间的间隙锁住,避免新的数据插入。但是如果两个事务,事务1先进行当前读,然后事务2插入了一条记录并提交,再在事务1中进行update新插入的这条记录是可以更新出成功的,这就是发生了幻读。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值