Mysql事务

一、事务

事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。
事务作用:保证在一个事务中多次SQL操作要么全都成功,要么全都失败。

1、特性

  • 原子性:事务的操作要么都发生,要么都不发生;
  • 一致性:事务前后数据的完整性必须保持一致;
  • 隔离性:一个用户的事务不能被其他用户的事务干扰;多个并发事务之间的数据相互隔离;隔离性由隔离级别保障!
  • 持久性:事务一旦提交,对数据的修改时永久性的;

2、事务并发问题

  • 脏读:一个事务读到了另一个事务未提交的数据
  • 不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发事务中的多次查询结果不
    一致
  • 虚读 /幻读:一个事务读到了另一个事务已经插入(insert)的数据。导致事务中多次查询的结果不一
  • 丢失更新的问题!

3、隔离级别

  • read uncommitted 读未提交【RU】,一个事务读到另一个事务没有提交的数据
    存在:3个问题(脏读、不可重复读、幻读)。
  • read committed 读已提交【RC】,一个事务读到另一个事务已经提交的数据
    存在:2个问题(不可重复读、幻读)。
    解决:1个问题(脏读)
  • repeatable read:可重复读【RR】,在一个事务中读到的数据始终保持一致,无论另一个事务是
    否提交
    解决:3个问题(脏读、不可重复读、幻读)
  • serializable 串行化,同时只能执行一个事务,相当于事务中的单线程
    解决:3个问题(脏读、不可重复读、幻读)

二、事务底层

1、丢失更新问题

  • 两个事务针对同一个数据进行修改操作时会丢失更新!
  • 解决方案:
    • 基于锁并发控制LBCC
    • 基于版本并发控制MVCC

三、MVCC

核心思想是读不加锁,读写不冲突

MVCC 实现原理关键在于数据快照,不同的事务访问不同版本的数据快照,从而实现事务下对数据的隔离级别

MVCC,全称Multiversion Concurrency Control,即多版本并发控制,是数据库领域中一种用于管理并发数据访问的机制。与数据库锁相似,MVCC也是一种并发控制的解决方案,但它侧重于通过维护数据的多个版本来避免读写冲突,从而提高并发性能。

MVCC的基本原理

在数据库中,对数据的操作主要分为读和写两种。在并发场景下,会出现读-读并发、读-写并发和写-写并发三种情况。其中,读-读并发通常不会引发问题,写-写并发则常通过加锁来解决,而读-写并发则可以通过MVCC机制来高效处理。

MVCC的核心思想是,对于同一份数据,每个事务在读取时都会看到一个特定的、一致的数据版本,这个版本是在该事务开始时刻生成的。这样,即使有其他事务在修改数据,也不会影响到当前事务的读取结果。

快照读与当前读

MVCC的实现依赖于快照读的概念。快照读是指读取的是快照数据,即快照生成时的数据状态。在MySQL中,普通的SELECT语句(不加锁)通常就是快照读。与快照读相对应的是当前读,它读取的是最新数据,通常用于加锁的SELECT操作或数据的增删改操作。

Undo Log与快照

Undo Log是MySQL中用于回退的事务日志。在事务提交之前,MySQL会先记录更新前的数据到Undo Log中。这些“更新前的数据”实际上就是快照数据。因此,Undo Log是MVCC实现的重要手段。

每当一条记录发生变更时,MySQL都会先将其快照存储到Undo Log中,并更新记录中的隐式字段。这些隐式字段包括:

  • db_row_id:隐藏主键,用于创建聚簇索引。
  • db_trx_id:对这条记录做了最新一次修改的事务的ID。
  • db_roll_ptr:回滚指针,指向这条记录的上一个版本(即Undo Log中的上一个快照的地址)。

这样,每个快照都通过db_trx_iddb_roll_ptr字段形成了一个快照链表。

Read View与可见性

然而,即使有了Undo Log和快照链表,我们仍然需要确定在当前事务中应该读取哪个快照。这时,就需要用到Read View了。

Read View是InnoDB中一个至关重要的概念,它是实现MVCC的基础。Read View主要用来解决可见性问题,即它会告诉当前事务应该看到哪个版本的数据。具体来说,Read View会根据当前事务的ID和其他活跃事务的ID来构建一个视图,然后基于这个视图来确定哪些数据版本对当前事务是可见的。

通过Read View,InnoDB能够确保每个事务在读取数据时都能看到一个一致的快照,从而避免了读写冲突,提高了并发性能。

综上所述,MVCC通过维护数据的多个版本、利用快照读和Undo Log以及Read View等机制,实现了高效的并发控制。这使得数据库能够在高并发环境下保持数据的一致性和完整性,同时提高了系统的性能和吞吐量。

小结

  • MVCC指在使用RC、RR隔离级别下,使不同事务的 读-写 、 写-读 操作并发执行,提升系统性能
  • MVCC核心思想是读不加锁,读写不冲突。
  • RC、RR这两个隔离级别的一个很大不同就是生成 ReadView 的时机不同
  • RC在每一次进行普通 SELECT 操作前都会生成一个 ReadView
  • RR在第一次进行普通 SELECT 操作前生成一个 ReadView ,之后的查询操作都重复这个ReadView
 wechat
天生我才必有用