MySQL事务隔离级别和MVCC

标准的4中隔离级别

  • READ UNCOMMITED:未提交读
    最低的隔离级别,事务可以看到其他事务未提交的修改。这个级别下,存在脏读(Dirty Read)的问题,即一个事务读取到了另一个未提交事务的数据修改。
  • READ COMMITED:已提交度
    事务只能看到已经提交的数据修改。这个级别避免了脏读,但可能出现不可重复读(Non-repeatable Read)的问题,即在同一个事务中,多次读取同一行数据时,可能得到不同的结果。
  • REPEATABLE READ:可重复读
    事务执行期间保证多次读取同一行数据的结果是一致的。在这个级别下,MySQL使用多版本并发控制(MVCC)机制来实现,确保读取的数据是在事务开始时的一个一致视图,解决幻读(Phantom)。
  • SERIALIZABLE:可串行化
    最高的隔离级别,事务之间完全串行化执行,确保不会出现任何并发问题。在这个级别下,MySQL会对事务进行加锁,以保证事务之间的互斥性。

四种隔离级别实现机制:

  • 未提交读,采取的是读不加锁原理。
    事务读不加锁,不阻塞其他事务的读和写
    事务写阻塞其他事务写,但不阻塞其他事务读;
  • 读取已提交&可重复读
    读取已提交和可重复读级别利用了ReadView和MVCC,也就是每个事务只能读取它能看到的版本(ReadView)。
    READ COMMITTED:每次读取数据前都生成一个 ReadView
    REPEATABLE READ:在第一次读取数据时生成一个 ReadView
  • 串行化
    串行化的实现采用的是读写都加锁的原理,串行化的情况下,对于同一行事务,写会加写锁,读会加读锁。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

MVCC(多版本并发控制)

MVCC(Multi-Version Concurrency Control)是MySQL中用于实现可重复读隔离级别的并发控制机制。它通过在数据行中维护多个版本来实现并发读取和写入的一致性。下面是MVCC的核心原理:

版本链

根据聚簇索引记录中的两个必要列(row_id,主键或者是非NULL的唯一索引)

  • trx_id:一个事物每次对某条聚簇索引记录进行改动,都会把该事物的事物id赋值给trx_id影藏列。
  • roll_pointer:每次对某条聚簇索引记录进行改动,都会把旧版写入到undo日志中。

ReadView

Read View(读视图)是用于实现多版本并发控制(MVCC)机制的重要概念之一。Read View是事务在特定时间点看到的数据库的一致性视图。

purge

在合适的时候把update undo日志以及仅仅被标记删除的记录彻底删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值