今日分享开始啦,请大家多多指教~
今天给大家整理一些面试会提到的MySQL内容,大家要注意看哦!希望大家看完之后有所收获,祝大家面试成功!
MySQL的事务隔离级别有哪些?分别用于解决什么问题?
主要用于解决脏读、不可重复读、幻读。
脏读:一个事务读取到另一个事务还未提交的数据。
不可重复读:在一个事务中多次读取同一个数据时,结果出现不一致。
幻读:在一个事务中使用相同的SQL两次读取,第二次读取到了其他事务新插入的行。
不可重复读注重于数据的修改,而幻读注重于数据的插入。
MySQL的可重复读怎么实现的?
使用MVCC实现的,即Mutil-VersionConcurrencyControl,多版本并发控制。关于MVCC,比较常见的说法如下,包括《高性能MySQL》也是这么介绍的。
InnoDB在每行记录后面保存两个隐藏的列,分别保存了数据行的创建版本号和删除版本号。每开始一个新的事务,系统版本号都会递增。事务开始时刻的版本号会作为事务的版本号,用来和查询到的每行记录的版本号对比。在可重复读级别下,MVCC是如何操作的:
SELECT:必须同时满足以下两个条件,才能查询到。1)只查版本号早于当前版本的数据行;2)行的删除版本要么未定义,要么大于当前事务版本号。
INSERT:为插入的每一行保存当前系统版本号作为创建版本号。
DELETE:为删除的每一行保存当前系统版本号作为删除版本号。
UPDATE:插入一条新数据,保存当前系统版本号作为创建版本号。同时保存当前系统版本号作为原来的数据行删除版本号。
MVCC只作用于RC(ReadCommitted)和RR(RepeatableRead)级别,因为RU(ReadUn