事务的四大特性+MVCC

四大特性

  1. 原子性(Atomicity)

    定义:事务被视为一个不可分割的操作序列,要么全部成功,要么全部失败。
  2. 一致性(Consistency)

    定义:事务在执行前后,数据库的状态必须保持一致。(如主键、外键、唯一性约束等)
  3. 隔离性(Isolation)

    定义:多个并发事务之间的执行互不影响,各自独立运行。
  4. 持久性(Durability)

    定义:一旦事务被提交,其结果是永久性的,即使系统崩溃,提交的事务也会被保存。

redo log实现了事务的持久性

undo log实现了事务的原子性和一致性
事务的隔离性是由排他锁和mvcc实现的。

redo log、undolog在我之前的文章中已经介绍过了

Mysql引擎工作原理(介绍undo log和redo log)

MVCC

下面重点介绍MVCC 多版本并发控制

隐藏字段

当面试官询问MVCC的原理的时候,我们应该要先说明数据中的三个隐藏字段

执行update、delete操作的时候产生的undo log日志不会立即被删除,因为mvcc还要用 

undo log 版本链

每一次修改的时候,会指向上一次的数据

readview

首先介绍一些当前读和快照读

当前读就是读数据库中最新的数据

快照读就是去读可见版本,比如下图中,如果是隔离级别为RR(可重复读)

事务A两次读取的数据是一样对 
 


 

一个事务读操作要结合undo log版本链和readview的规则(不用背)进行判断。

如下图,事务5进行读操作,他会先从事务4开始找是否满足,不满足再3 2 1 这样的顺序,直到
找到满足条件的版本。其实这些规则总结起来就是找 最大的已提交事务的id,读的就是这个数据

在RC隔离级别下,每一次读操作都会生成一个readwrite,这也解释了为什么会出现不可重复读的问题。
在RR隔离级别下,只有第一次读操作会生成readwrite,之后的读操作都使用该readwrite,这就是快照读

快照读(Snapshot Read) 是数据库中的一种读取机制,它允许事务在并发场景下读取数据时,获得一个一致性视图(或快照),而不会受到其他并发事务修改数据的影响。快照读的主要目的是确保在同一事务中多次读取的数据一致性,即使其他事务对这些数据进行了修改或提交,当前事务也不会看到这些修改。

锁在隔离级别中的应用:

  • 读已提交(Read Committed, RC):在RC隔离级别下,读操作会短暂获取共享锁,读完后立即释放,写操作则获取排他锁。
  • 可重复读(Repeatable Read, RR):在RR隔离级别下,读操作会一直持有共享锁,直到事务结束,以确保后续读取相同的数据时结果不会改变。写操作则使用排他锁,并且持锁时间较长。

各个隔离级别的实现方式:

  1. 未提交读(Read Uncommitted, RU)

    • 使用最少的锁,允许读到未提交的数据,没有MVCC的概念。
  2. 读已提交(Read Committed, RC)

    • 读操作使用MVCC,每次读取最新的已提交版本。
    • 写操作使用锁来保证数据一致性。
  3. 可重复读(Repeatable Read, RR)

    • 读操作使用MVCC生成一个一致性快照,保证多次读取的数据一致。
    • 写操作使用锁机制,避免数据被其他事务修改。
  4. 串行化(Serializable)

    • 通过使用严格的锁机制(如范围锁)或者MVCC的方式模拟串行化执行事务,确保完全的隔离性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值