今天是MySQL数据库基础知识整理的最后一章,本次我们要整理的是隔离性和MVCC多版本并发控制技术。
隔离性
在我们进行多事务的处理时,难免会出现多个事务由于不当的操作导致事务发生不可逆转的错误结果。因此,MySQLS数据库为了防止这样的事情发生,使多个并发事物之间相互隔离,每个事务都感觉不到其他事务的存在,从而确保数据库的一致性和可靠性。
隔离性主要是预防以下四种情况而采取的不同隔离等级:
- 脏读:事务A读取到了事务B没有提交前所修改的数据
- 不可重复读:事务A多次读取同一个数据,由于事务B对该数据进行了修改,导致事务A读取数据前后不一致
- 幻读:事务A在读取某个范围内的数据时,事务B插入了某个数据,导致事务B前后读取的数据行数不一致
- 丢失更新:事务A和事务B同时对一个数据进行更新,其中一个事务的更新被另一个事物的更新所覆盖,导致更新结果丢失
为了解决以上四种情况的发生,MySQL数据库提供了四种隔离级别,分别是:读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(serializable)。
- 读未提交:最低的隔离级别,在该级别下,一个事务可以读取另一个事务还未提交的数据。这种隔离级别会导致脏读、不可重复读、幻读等问题。
- 读已提交:在该级别下,一个事务只能读取另一个事务已经提交的数据。这种隔离级别可以避免脏读问题,但是仍然可能出现不可重复读和幻读问题。
- 可重复读:在该级别下,一个事务可以多次读取相同的数据,而其他事务不能对该数据进行修改。这种隔离级别可以避免脏读和不可重复读问题,但是仍然可能出现幻读问题。
- 串行化:在该级别下,所有事务都按照顺序依次执行,因此可以避免所有的并发问题,但是会牺牲一定的性能。
我们可以使用如下指令来设置事物的隔离级别:
set transaction isolation level 隔离级别;
//隔离级别可以是:read uncommitted,read committed,repeatable read,serializable
多版本并发控制
多版本并发控制(Multi-Version Concurrency Control,MVCC)是一种数据库并发控制技术,它可以在数据库中允许多个事务同时读取和写入数据。MVCC 技术通过创建多个版本的数据来实现并发控制,每个事务都可以看到一组数据的某个版本,不会被其他事务的修改所影响。简单理解,MVCC技术主要解决的是读写问题。
该技术主要基于以下两个原则:
- 读取操作不会被阻塞。每个事务都可以读取数据的某一个版本,不会被其他事务的修改所阻塞。
- 写入操作不会覆盖旧数据。每个事务写入数据时,会创建一个新的版本,并保留旧版本。这样事务之间就不会相互干扰。
MVCC技术的核心思想:我可以查看当前事务开始之前的数据,但在我开始事务之后的数据我都查不到。也就是说,假设我的事务A开始了,是将数据balance=5改为balance=10,那么在我提交数据之前,我想查看历史数据,我就只能找到5更早之前的数据,而不能找到修改为10的数据了。这也就是MVCC技术所使用的快照读模式。
当前读
当前读,也称为一致性读,是指读取最新提交的事务的数据。在当前读时,如果读取的数据正在被其他事务修改,则当前事务需要等待锁释放后才能读取最新的数据。当前读适用于对数据实时性要求较高的场景,如银行转账等。
快照读
快照读,则是读取事务开始前数据库中的数据,即使在读取过程中数据被其他事务修改了,也不会影响快照读的结果。快照读适用于对数据实时性要求不高的场景,如数据报表等。我们常使用的MVCC技术就是使用的快照读模式。
本次的内容就到这里了,由于是基础知识的讲解,比较适合新手观看。如果其中有错误的地方希望大佬批评指正!!