本文档题目来自MySQL纯手写面试笔记解析,2020锤爆35K月薪,你值得拥有
闲谈:可能还是自己怂吧。或者说实例不够,一直以来不善记忆,全凭理解,理解不了的当然也记不住,累了累了。
事务是什么?
事务有哪些特性?
MySQL 中有几种事务隔离级别?分别是什么?
幻读和不可重复读的区别?
并发事务一般有哪些问题?
什么是 MVCC?
如何设置 MySQL 的事务隔离级别?
事务是什么?
- 计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit);
- 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
事务有哪些特性(ACID)?
特性 | 解释 |
---|---|
原子性 | 不可分操作数据库的单位,要么全部执行,要么全部失败 |
一致性 | 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态 |
隔离性 | 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事物之间不能相互干扰 |
持久性 | 事务一旦提交,它对数据库的数据的改变就应该是永久性的,不能回滚 |
MySQL 中有几种事务隔离级别?分别是什么?
- 在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做都修改,哪些事务内都事务内和事务间是可见都,哪些是不可见都。较低级别都隔离通常可以执行更高都并发,系统的开销也更低。
- 使用方法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
级别 | 解释 |
---|---|
未提交读(最低级别) | 事务中的修改,即使没有提交,对其他事务也都是可见的(事务可以读取未提交的数据)。最低级别,性能最好(实际中很少用到) |
提交读 | 指一个事务开始时,只能看见已经提交的事务所做的修改。换句话说,一个事务从开始到提交之前,所做的任何修改对其他事务都是不可见的。可能存在两次读取数据时,查询结果不一致 |
可重复读(MySQL默认事务级别) | 解决了脏读的问题。该级别保证了同一个事务中多次读取同样记录的结果时一致的。但是可重复读还是无法解决幻读问题 |
串行化(最高级别) | 它通过强制事务串行执行,避免了幻读问题。简单来说,串行化会在读取的每一行数据上都加上锁。会导致大量的超时和锁竞争的问题,增大系统开销 |
脏读、幻读和不可重复读的区别?(并发事务出现的问题)
解释 | 场景 | |
---|---|---|
脏读 | 一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另一个事务也访问了该数据然后使用了这个数据 | 某个仓库库存100,此时管理人员修改成为500(但未提交),操作人员读取了这条数据(500)使用了,这个500就是脏数据 |
不可重复读 | 指在一个事务内,多次读取同一数据。在这个事务还没有结束时,另一个事务也访问了该数据。那么,在第一个事务中的两次读取数据之间,由于第二个事务的修改,那么第一个事务两次读取到的可能是不一样的。 | 。。。 |
幻读 | 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据,那么,以后就会发生操作第一个事务的用户发现表中还没有修改的数据行,就好像发生了幻觉一样 |
- 幻读和不可重复读问题在概念上都差不多,但不可重复读是同样的条件,你读取过的数据,再次读取出来发现值不一样,幻读是同样的条件,第一次和第二次读取出来的记录数不一样。
- 幻读问题在未提交读,提交读和可重复读级别都能发生。但是可重复读级别在innoDB存储引擎下可以通过并发控制MVCC解决幻读问题
什么是 MVCC(多版本并发控制)?
- MVCC是行级锁的一个变种。它在很多情况下避免了加锁操作,所以开销更低。同样,实现了非阻塞的读操作,写操作也只锁定修改必定的行
- MVCC的实现是通过保存数据在某个时间点的快照来实现的。不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。
- InnoDB的MVCC是通过在每行记录的后面保存两个隐藏列来实现。这两个列,一个是保存行的创建时间,一个是保存行的过期时间。存储都是系统版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的版本号会作为事务的版本号,用来查询到的每行记录的版本号进行比较。
- MVCC可以解决在可重复读隔离级别的幻读问题。实现方式就是通过两个隐藏列实现的。通过版本号,使幻读问题不在发生。
- 但MVCC只在可重复读和读提交两个级别下工作,因为未提交读总是读取最新的数据行,而不是符合当前事务版本的数据行。
MySQL 事务实现原理是什么?
通过Redo log