说说什么是 MVCC?
2 个回答
垆边人似月,皓腕凝霜雪。董克平笔记### MVCC(多版本并发控制) **MVCC**(Multiversion Concurrency Control)是一种通过维护多个数据版本来实现高并发控制的机制。与传统的锁机制不同,MVCC通过提供每个数据项的多个版本来允许并发读写,从而减少了锁的使用,提高了数据库的并发性和响应速度。它主要用于解决数据库中事务并发执行时可能出现的读-写并发问题。 ### 并发操作类型 在数据库中,对数据的操作有两种基本类型:**读**和**写**。在并发环境下,这两种操作可能会引发以下问题: 1. **读-读并发**:多个事务同时读取相同的数据,不会发生问题。 2. **读-写并发**:一个事务读取数据,另一个事务写入数据,可能导致不一致或脏读。 3. **写-写并发**:多个事务同时修改相同的数据,通常通过锁机制来避免数据冲突。 **MVCC**主要解决的是**读-写并发**问题,保证事务读取到的数据的一致性,即使在其他事务正在修改相同数据时。 ### MVCC的关键概念 1. **快照读与当前读** - **快照读**:读取的是数据的快照版本,而非当前最新数据。普通的 `SELECT` 查询在没有加锁的情况下通常是快照读。这种读操作不会阻塞写操作,因此可以高效执行。 - **当前读**:读取的是最新的数据,通常通过加锁来确保数据的一致性。例如,`SELECT FOR UPDATE` 或数据的增删改操作都是当前读,它会阻止其他事务修改数据直到当前事务完成。 2. **Undo Log(回滚日志)** - **Undo Log** 是 MySQL 中的重要事务日志,它记录了事务修改前的数据状态。当事务回滚或数据库崩溃时,Undo Log 会用来恢复数据。 - Undo Log 中保存了多个版本的数据快照,**快照读**操作可以从 Undo Log 中读取历史数据。 3. **隐式字段** - 在数据库表的每一行记录中,除了存储用户定义的字段外,还包含一些隐式字段,如: - `db_row_id`:隐式主键,用于唯一标识行记录。 - `db_trx_id`:最后一次修改该行的事务ID。 - `db_roll_ptr`:回滚指针,指向该行记录的上一个版本(快照)。 4. **Read View(读取视图)** - **Read View** 是 MVCC 的核心组件,用于解决数据可见性的问题。每当一个事务开始时,它会创建一个 Read View,指示该事务可以看到哪些数据版本。Read View 的主要目的是确保事务只读取在其开始时已提交的数据版本,而忽略其他事务的未提交更改。 - Read View 中包含以下信息: - `trx_ids`:当前系统中所有活跃的事务ID。 - `low_limit_id`:下一个事务ID的最小值,表示当前活跃的事务范围。 - `up_limit_id`:未提交事务中的最小事务ID。 - `creator_trx_id`:创建该 Read View 的事务ID。 ### MVCC的工作机制 1. 当事务读取数据时,首先会通过 **Read View** 判断数据是否对该事务可见。如果数据已经由其他事务修改且未提交,则该数据会被认为不可见。否则,事务会读取数据的快照(历史版本)。 2. **快照链表**:每条记录可能有多个版本,版本之间通过 `db_roll_ptr` 指向形成快照链表。事务通过 Undo Log 查找数据的历史版本。 3. **可见性判断**:根据 `Read View` 中的事务ID和数据的 `db_trx_id`,系统判断数据是否可见。如果数据不可见(即数据版本被其他事务修改),则从 Undo Log 中获取该数据的历史版本。 ### 事务隔离级别与MVCC的关系 MVCC的实现依赖于数据库的事务隔离级别,主要分为以下几种: 1. **读已提交(Read Committed)**:每次查询都获取一个新的 Read View,因此每次读取的数据可能不同,可能出现不可重复读问题。 2. **可重复读(Repeatable Read)**:在事务期间只创建一个 Read View,这样在同一事务内的多次读取将返回相同的结果,避免了不可重复读的问题。MVCC解决了在可重复读下的不可重复读问题。 3. **串行化(Serializable)**:最高级别的隔离级别,通过锁机制确保所有事务按顺序执行,避免幻读、脏读、不可重复读等问题。 ### 典型的应用场景 - **高并发环境**:在有大量并发查询和更新的场景下,MVCC通过避免锁竞争,提供了高效的并发控制,减少了事务之间的阻塞。 - **支持复杂查询和分析**:如在线分析处理(OLAP)系统中,允许多个事务并行读取历史数据,避免了复杂的查询在事务处理期间的阻塞。 ### 总结 MVCC通过**快照读**(读取数据的历史快照)和**当前读**(读取最新数据)相结合的方式,解决了**读-写并发**的问题,保证了高并发环境下的数据一致性。Undo Log 和 Read View 是实现 MVCC 的核心组件,通过它们可以有效管理不同事务对数据的读写操作,提供一个高效、非阻塞的并发控制机制。发布于 2024-10-21 01:07 •IP属地 福建举报评论收藏
时间不在乎你拥有多少,而在于你怎样使用。周小凤### 什么是 MVCC? 多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种用于解决读写冲突的无锁并发控制机制。它通过为每个事务分配一个单调递增的时间戳,并为每次数据修改保存一个版本,来实现并发控制。 #### MVCC 的工作原理 1. **时间戳**: - 每个事务在开始时都会被分配一个唯一的时间戳,用于标识事务的先后顺序。 2. **版本控制**: - 每次对数据进行修改时,都会生成一个新的版本。每个版本与创建它的事务时间戳相关联。 3. **快照读**: - 读操作不会直接读取当前数据,而是读取该事务开始前的数据库快照(即数据的一个副本)。 - 这样,读操作可以读取一致的数据,而不会被并发的写操作阻塞。 4. **写操作**: - 写操作也不会阻塞读操作。每次写操作会创建一个新的数据版本,而不会影响正在进行的读操作。 - 事务提交时,才会将修改应用到数据库中,并使新的版本生效。 #### 优点 - **并发性**:读操作不会被写操作阻塞,写操作也不会被读操作阻塞,提高了系统的并发性能。 - **数据一致性**:通过读取事务开始前的快照,避免了脏读和不可重复读的问题。 - **无锁控制**:避免了传统锁机制带来的开销和死锁问题。 #### 缺点 - **存储开销**:需要额外的存储空间来保存多个数据版本。 - **复杂性**:实现和维护 MVCC 机制相对复杂。 #### 示例 假设有一张用户表,包含用户的余额信息。两个事务 T1 和 T2 并发进行: - **T1**:读取用户余额。 - **T2**:更新用户余额。 在 MVCC 机制下: - T1 在开始时获取数据库的快照,并读取该快照中的用户余额。 - T2 对用户余额进行修改,创建一个新的数据版本。 - T1 读取的余额不受 T2 修改的影响,因为 T1 读取的是事务开始前的快照。 - 当 T2 提交时,新的余额版本生效。 ### 总结 多版本并发控制(MVCC)通过为每个事务分配时间戳和保存多个数据版本,实现了无锁并发控制,解决了读写冲突的问题。MVCC 提高了系统的并发性能,确保数据一致性,避免了脏读和不可重复读的问题。发布于 2024-08-03 11:11 •IP属地 内蒙古举报评论收藏
公众号进入网站体验更佳

