事务原理及MVCC

事务

1.什么是事务

        事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。

        事务最经典也经常被拿出来说例子就是转账了。

        假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

2.事务的四大特性

        事务就是一组原子性的操作,这些操作要么全部发生,要么全部不发生。事务把数据库从一种一致性状态转换成另一种一致性状态。

        原子性 :事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

        一致性 :事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

        隔离性 :一个事务的执行不能其它事务干扰。即一个事务内部的//操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

        持续性 :也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

3 .事务的实现原理

持久性: redolog

        当我们在执行update以及delete操作时,首先时将操作提交到(缓冲区)Buffer Pool中,如果缓冲区没有要进行操作的数据后台线程会从磁盘中将数据读取到缓冲区,然后对缓冲区的数据进行操作。此时缓冲区的数据页就是脏页,需要将缓冲区的数据定时刷新到磁盘中,此时磁盘中的数据和缓冲区的数据一致。

        然而当缓冲区向磁盘刷新数据时如果出现了错误,此时由于事务已经提交但是缓冲区与磁盘中的数据不一致,破坏了事务的持久性。所以我们就需要通过redo.log(重做日志)实现数据的持久性。

        redo.log(重做日志):是由重做日志缓冲(RedoLog buffer)以及重做日志文件(redo log file)组成,前者是在内存中,后者在磁盘中。

        当我们对缓冲区数据页进行操作时,RedoLog buffer会对进行的操作记录,当事务提交的时候会将RedoLog buffer直接刷新到磁盘中,在进行脏页刷新时如果出现错误时,可以通过Redolog进行数据恢复。

原子性:undolog

        回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚 和 MVCC(多版本并发控制)。

        undolog和redolog记录物理日志不一样,它是逻辑日志。

        可以认为当delete一条记录时,undo og中会记录一条对应的insert记录,反亦然,当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。

        Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。

        Undo log存储: undo log采用段的方式进行管理和记录,存放在前面介绍的 rollback segment 回滚段中,内部包含1024个undo logsegment。

MVCC

首先我们先了解一下数据库读取数据的两种方式。

当前读:
        读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select ... lockin share mode(共享锁),select ...for update、update、insert、delete(排他锁)都是一种当前读.
快照读:
        简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

  • Read Committed:每次select,都生成一个快照读。
  • Repeatable Read:开启事务后第一个select语句才是快照读的地方
  • Serializable:快照读会退化为当前读。

        它们的区别主要在于读取的数据的一致性和隔离级别。当前读提供了最新的数据,但可能受到其他事务的影响;而快照读提供了一致性的数据,但可能不是最新的。

简介

        全称 Multi-version Concurrency ontrol多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySOL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undolog日志、readView。

三个隐藏字段

 undo log版本链

        在并发访问的情况下,InnoDB会将变更之前的数据在undo log中进行记录生成日志,并生成这个日志的地址值。其中隐藏字段的最近修改事务id为自增,回滚指针为空。

        我们进行一次数据操作后,隐藏字段中的最近修改事务id会变成此次数据操作的事务id,同时将隐藏字段中的回滚指针指向undo log中变更前生成的记录的地址值。

        当我们再次进行数据操作时,InnoDB会将变更前的数据记录到undo log日志中,并修改当前数据的隐藏字段,将回滚指针指向生成的日志地址。

        多次操作后,会在undo log中生成一条日志链,在数据隐藏字段的回滚指针中指向undo log日志链的尾部,尾部日志的回滚指针会指向上一次日志,直到最初回滚指针为空的日志记录。

        不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

readView

        ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。
ReadView中包含了四个核心字段:

版本链数据访问规则

不同的隔离级别,生成Readview的时机不同:
READ COMMITTED : 在事务中每一次执行快照读时生成ReadView。
REPEATABLE READ: 仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

版本链访问规则详解

88. 进阶-InnoDB引擎-MVCC-原理分析(RC级别)_哔哩哔哩_bilibili

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值