八股十问之MySQL事务
原子性,事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。
一致性,事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
隔离性,一个事务在执行过程中,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
2、事务同时执行时,会出现哪些问题?
脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。
不可重复读:在⼀个事务内多次读同⼀数据,但这个事务还没有结束时,另⼀个事务也访问该数据。导致在⼀个事务内两次读到的数据是不⼀样的情况。
3、MySQL中事务的隔离级别有哪几个?
读未提交,一个事务还没提交时,它做的变更就能被别的事务看到。
读提交,一个事务提交之后,它做的变更才会被其他事务看到。
可重复读,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。
4、什么是数据库多版本并发控制(MVCC)?
5、什么是事务数组?什么是低水位?什么是高水位?
6、数据版本的可见性规则是什么?
对于事务启动的瞬间,一个数据版本row trx_id有三种情况:
a. 如果小于低水位,表示已经提交事务生成的数据版本,数据是可见的。
b. 如果大于等于高水位,表示由将来启动的事务生成的数据版本,是不可见的。
7、可重复读是如何实现的?
8、什么是undo_log? undo_log用于哪些场景?
9、可重复读中秒级创建快照是如何实现的?
10、可重复读和读提交两种隔离级别,在实现上最大区别是什么?
在可重复读隔离级别下,只需要在事务开始的时候创建一致性视图,之后事务里的其他查询都共用这个一致性视图;