八股十问之MySQL事务

文章来源(公众号:八股bro,每天一篇面试经典八股文分享
1、事务有哪些特性?

原子性,事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。

一致性,事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

隔离性,一个事务在执行过程中,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性,一个事务一旦被提交,它对数据库中数据的改变就是永久性的。

2、事务同时执行时,会出现哪些问题?

脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。

不可重复读:在⼀个事务内多次读同⼀数据,但这个事务还没有结束时,另⼀个事务也访问该数据。导致在⼀个事务内两次读到的数据是不⼀样的情况。

幻读:当⼀个事务(T1)读取了⼏⾏数据,另⼀个并发事务(T2)插⼊了⼀些数据时。在随后的查询中,第⼀个事务(T1)就会发现多了⼀些原本不存在的记录。

3、MySQL中事务的隔离级别有哪几个?

读未提交,一个事务还没提交时,它做的变更就能被别的事务看到。

读提交,一个事务提交之后,它做的变更才会被其他事务看到。

可重复读,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。

串行化,对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

4、什么是数据库多版本并发控制(MVCC)?

同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。每次事务更新数据的时候,会给行数据生成新的版本,每个版本都有自己的row trx_id,表示更新的事务ID(随时间单调递增)。

5、什么是事务数组?什么是低水位?什么是高水位?

在事务启动的瞬间,事务数组记录下来当前所有活动的事务ID,将其中数组内最小值记为低水位,系统创建的事务ID最大值加1记为高水位。

6、数据版本的可见性规则是什么?

对于事务启动的瞬间,一个数据版本row trx_id有三种情况:

a. 如果小于低水位,表示已经提交事务生成的数据版本,数据是可见的。

b. 如果大于等于高水位,表示由将来启动的事务生成的数据版本,是不可见的。

c. 如果在二者之间,分成两种情况:如果数据版本出现在事务数组中,表示该版本由还没提交事务生成,不可见。如果没有出现在事务数组中,表示该版本由已经提交事务生成,是可见的。

7、可重复读是如何实现的?

在可重复读的隔离级别下,会在事务启动时,创建快照,整个事务执行期间都在使用这个视图。因此,在可重复读隔离级别下,一个事务执行过程中看到的数据,总是和这个事务在启动时看到的数据是一致的。

8、什么是undo_log? undo_log用于哪些场景?

undo_log是逻辑日志,用于记录数据更新之前的值。undo_log可以用于事务回滚,即事务的原子性,和多版本并发控制(MVCC)。

9、可重复读中秒级创建快照是如何实现的?

在事务启动时,根据事务数组判断当前数据版本是否可见。如果不可见,根据undo_log,寻找前一数据版本,直到可见的数据版本,并根据该版本来创建快照。

10、可重复读和读提交两种隔离级别,在实现上最大区别是什么?

在可重复读隔离级别下,只需要在事务开始的时候创建一致性视图,之后事务里的其他查询都共用这个一致性视图;

在读提交隔离级别下,每一个语句执行前都会重新算出一个新的视图。

文章来源(公众号:八股bro,每天一篇面试经典八股文分享
#面经##MySQL##学习路径#
全部评论
感谢大佬分享!!!
点赞
送花
回复
分享
发布于 2022-01-19 12:50

相关推荐

科大讯飞消费者bg二级研究院 语音算法岗 24k*14
点赞 评论 收藏
转发
2 41 评论
分享
牛客网
牛客企业服务