postgresql select for update 多行加锁顺序_PostgreSQL和Mysql的MVCC实现机制的差异对比

本文深入探讨了PostgreSQL和InnoDB在多版本并发控制(MVCC)实现上的区别,包括如何存储多个版本、并发操作的处理以及空间回收策略。PostgreSQL在堆中存储所有版本,可能导致存储膨胀,而InnoDB使用Undo段存储旧版本,减少空间占用。文章还讨论了两者在INSERT、UPDATE和DELETE操作以及回滚和空间回收方面的差异。
摘要由CSDN通过智能技术生成

任何数据库的主要要求之一就是实现可伸缩性。只有将争用(锁定)最小化(如果不能一起删除),才可以实现。由于读/写/更新/删除是数据库中发生的一些主要的频繁操作,因此对于这些操作并发进行而不被阻塞非常重要。为了实现这一目标,大多数主要数据库都采用了一种称为多版本并发控制的并发模型该模型将争用降低到最低限度。

什么是MVCC

多版本并发控制(以下简称MVCC)是一种算法,可通过维护同一对象的多个版本来提供精细的并发控制,以使READ和WRITE操作不会冲突。这里的WRITE表示UPDATE和DELETE,因为无论如何新插入的记录都将按照隔离级别受到保护。每个WRITE操作都会生成对象的新版本,并且每个并发读取操作都会根据隔离级别读取对象的不同版本。由于读取和写入操作均在同一对象的不同版本上进行,因此这些操作都不需要完全锁定,因此两者都可以并发操作。争用仍然存在的唯一情况是当两个并发事务尝试写入同一记录时。

当前大多数主要数据库都支持MVCC。该算法的目的是维护同一对象的多个版本,因此MVCC的实现因数据库而异,仅在创建和维护多个版本方面有所不同。因此,相应的数据库操作和数据存储发生了变化。

公认的实现MVCC的方法是PostgreSQL和Firebird / Interbase使用的一种,而InnoDB和Oracle使用的另一种。在随后的章节中,我们将详细讨论如何在PostgreSQL和InnoDB中实现它。

PostgreSQL中的MVCC

为了支持多个版本,PostgreSQL维护每个对象的其他字段(PostgreSQL术语为Tuple),如下所述:

  1. xmin –插入或更新元组的交易的交易ID。如果是UPDATE,则将使用此事务ID分配更新版本的元组。
  2. xmax –删除或更新元组的交易的交易ID。如果是UPDATE,则为元组的当前现有版本分配此事务ID。在新创建的元组上,此字段的默认值为null。

PostgreSQL将所有数据存储在称为HEAP的主存储中(页面的默认大小为8KB)。所有新元组都将xmin作为创建它的事务进行处理,而旧版本元组(已更新或删除)将分配给xmax。从旧版本元组到新版本始终存在链接。在隔离的情况下,较旧版本的元组可用于在回滚的情况下重新创建元组,并可通过READ语句读取较旧版本的元组。

考虑到表有两个元组,T1(值1)和T2(值2),可以在下面的3个步骤中演示新行的创建:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值