暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

了解PG的MVCC可见性基本检查规则

原创 eternity 2022-07-27
1050

1、引言

Vadim Mikheev表示,PostgreSQL的多版本并发控制(MVCC)是“在多用户环境中提高数据库性能的高级技术”。这种技术要求系统中存在同一数据元组的多个“版本”,由在不同时间段拍摄的快照控制。换言之,在这种技术下,PG负责根据多个参数(如拍摄的快照、当前事务ID等)计算出用户可见的元组数和不可见的元组数。这在PG中也称为可见性检查规则,今天在本博客中,我将讨论可见性检查的基本原则,以便您了解PG如何在内部执行此任务,我希望这对您的开发工作有所帮助。

2、涉及的参数

元组本身,包含:

  • xmin(插入此元组的事务ID)

  • xmax(如果>0,则删除此元组的事务ID,否则不会删除)

  • cid(命令ID)

  • hintbit

  • 全局顶级事务ID(如果可用)

  • 当前快照,其中还包含xmin、xmax和cid

  • 提交日志数据(阻塞)

3、流程

3.1检查铰链

可见性过程从检查hintbit开始。如果hintbit的状态为COMMITTED,那么我们可以跳过大多数其他可见性检查规则以提高效率。在提交元组后,PG然后获取该元组的xmin值以检查当前快照,以确保该元组当前没有进行。(正在确定的公式见下文3.3)。此检查是必需的,因为此元组虽然已提交,但此时仍有可能被其他后端进程更新。如果元组当前没有被其他后端处理,它将最终检查其xmax值以确保其无效。无效表示未删除。当上述所有条件均成立时,该元组可视。

若hintbit指示中止,那个么这个元组对用户来说是不可见的。如果hintbit没有值,那么PG应该继续执行其余的可见性检查规则。

3.2检查元组的xmin是否等于全局顶级事务ID

下一个检查涉及取元组的xmin,并与全局顶级事务ID进行比较,以查看它们是否相等。只有当用户使用begin子句手动启动事务时,才会设置此全局顶级事务ID。如果用户没有以这种方式启动事务(没有发出begin子句),则不会设置此全局顶级事务ID,因此将跳过此检查。

如果元组xmin等于全局顶级事务ID,这意味着元组当前正在由当前后端进行,而不是由其他后端进行。这是使用命令ID(cid)确定可见性的地方。在事务块内,发出的每个命令都有一个相关的命令ID,以指示先发出的命令和后发出的命令。例如,如果SELECT在事务中的更新之后出现,则SELECT必须看到由前一个UPDATE子句更新的新元组,并且cid在该确定中起作用。这种行为也受到隔离级别的控制,不幸的是,隔离级别超出了本博客的范围。默认隔离级别为“读取提交”,这使得SELECT可以看到数据因之前的更新而更改;但是,如果隔离设置为可重复读取,则SELECT将不会看到数据因之前的更新而更改。请记住这一点。

如果元组的xmin不等于全局顶级事务ID,那么PG应该继续保持其余的可见性

3.3检查当前快照

下一个检查涉及PG,以检查此元组当前是否正在由其他后端进程进行。这是通过根据此公式将元组的xmin值与当前快照的xmin和xmax值进行比较来实现的。

  • 元组xmin<快照xmin=未进行

  • 元组xmin>=快照xmax=正在进行

如果快照认为该元组正在进行中,则当前用户不能看到该元组,因为其他后端仍在处理该元组。如果未考虑此元组,则PG应继续执行其余的可见性检查规则。

3.4检查提交日志(阻塞)

下一个检查涉及PG获取元组的xmin来检查阻塞,以查看该元组是否已提交或中止。CLOG就像一个事务ID数组,每个数组元素存储一个提交状态。PG有一个公式可以将事务ID转换为阻塞块加上偏移量,以精确访问正确的阻塞元素。该阻塞数据结构通过检查点进程定期刷新到磁盘,它位于以下3个目录中:pg\u xact、pg\u multixact和pg\u subtrans。

如果CLOG说给定的元组已提交,那么PG将继续检查元组的xmax值以确保其无效。无效意味着它尚未被删除,因此对用户可见。同时,PG还将此元组的hintbit值更新为COMMITTED,以便在下一次可见性检查中,PG不会再次访问阻塞,这相当昂贵。

如果CLOG说给定的元组已中止或无效,则当前用户看不到该元组。同时,它还将此元组的hintbit值更新为INVALID

总结

根据我的理解,上述过程是PG中非常基本的可见性规则。当然,这里没有提到其他复杂的检查,例如子事务和多事务的参与,但它们确实遵循与今天提到的模式有些类似的模式。我希望这个博客能对你有所帮助。

关于作者

Cary是HighGo Software Canada的高级软件开发人员,在加入HighGo之前,他拥有8年在智能电网和计量领域用C/C++开发创新软件解决方案的行业经验。2012年,他在温哥华英国哥伦比亚大学(University of British Columnbia,UBC)获得电气工程学士学位,在先进网络、网络和数据安全、智能计量创新、Docker部署管理、软件工程生命周期、可扩展性、认证、加密、,PostgreSQL和非关系数据库、web服务、防火墙、嵌入式系统、RTOS、ARM、PKI、Cisco设备、功能和架构设计。

原文标题:Understand PG’s MVCC Visibility Basic Check Rules
原文作者:Cary Huang
原文链接:https://www.highgo.ca/2022/06/10/understand-pgs-mvcc-visibility-basic-check-rules/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论