MVCC图示

磨砺技术珠矶,践行数据之道,追求卓越价值  

回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页

[作者:高健@博客园 luckyjackgao@gmail.com]

 

资料来源:

其中对于MVCC的描述比较容易理解,特此贴图备忘

图1:事务T1改变数据V1,将其改为数据V2,在堆中,数据如下图

 

图2:事务T3改变了V2,将其改为V3,在堆中,数据如下图:目前事务T2还在活动中,所以V1和V2属于recently dead状态,而不是真的dead状态。

 

 

图3:从可视性而言,事务T0只能看到数据V1。因为它早于事务T1启动。

 

 

图4:事务T1提交后,事务T2启动,此时事务T3尚未启动,故T2可以看到T1提交后的数据V2。

 

 

 

图5:事务T3提交后,事务T4启动,故T4只能看到数据V3。

 

 

图6: 前面说过,当还有事务活动中访问数据V1和V2,V1和V2的状态是recently dead。

当T0和T2都结束,已经没有事务在访问数据V1和V2了,此时V1和V2为dead状态,所以V1和V2都成为VACUUM的处理对象了。

 

[作者:高健@博客园 luckyjackgao@gmail.com]

回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页

磨砺技术珠矶,践行数据之道,追求卓越价值  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL的MVCC(多版本并发控制)是一种用于支持事务并维持数据一致性的同时,允许并发读写的机制。这种技术在数据库管理系统中非常关键,尤其是在处理事务性和并发操作时。 ### MVCC的工作原理 #### 时间戳隔离 在MVCC中,每一行数据都有一个称为“时间戳”的版本标识符。当一个事务开始时,它会获取一个时间点作为其活动的开始,这个时间点包含了所有已提交事务的时间戳信息。事务在其整个生命周期内,只能够访问和修改那些在这个时间点前或同时创建的数据。 #### 数据行和快照 在MVCC中,数据行不是直接存储其原始值,而是包含了一个额外的版本信息。每个查询或操作都会从数据库中加载一组所谓的“快照”,即特定时刻的所有活跃事务的状态。这些快照由一系列的版本(版本树)组成,其中每个节点表示一个事务的更新状态。 #### 写入与删除 写入操作会在现有数据上建立一个新的版本,并将旧版本标记为历史记录。如果需要,可以保留多个历史版本供日志和恢复使用。删除操作实际上是修改数据的一次写操作,将其标记为不可见而非物理删除,以便于保持查询性能。 ### 相关优势 1. **高并发性**:通过限制事务对数据的访问范围,使得多个事务可以在同一时间内运行而不相互干扰。 2. **冲突解决**:自动管理并发操作带来的冲突,减少了应用开发者在并发处理上的复杂度。 3. **安全性**:避免了死锁和其他并发问题,提高了系统的稳定性和可靠性。 4. **性能优化**:通过避免全表扫描等低效操作,提高查询效率。 ### 使用场景及限制 1. **多用户环境**:在大量并发用户同时请求的情况下,MVCC能有效减少锁定等待时间和提高系统吞吐量。 2. **数据完整性**:确保在高负载下仍能满足ACID(原子性、一致性、隔离性、持久性)属性的需求。 3. **复杂查询**:支持复杂的SQL查询,包括JOIN操作,而不会因为并发读写引起的问题。 然而,尽管有上述优点,MVCC也有其局限性: - 需要更多的磁盘空间来存储额外的版本数据。 - 对一些特殊的查询或需求可能不如其他并发控制策略高效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值