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,java)