设为首页 收藏本站
查看: 2038|回复: 0

[经验分享] PostgreSQL 事务模型介绍

[复制链接]

尚未签到

发表于 2016-12-21 10:29:58 | 显示全部楼层 |阅读模式
  PostgreSQL有自己的事务实现模型。总体上分为三层:top layer, middle layer和bottom layer。
  1. Top Layer
  Top Layer主要由用户控制,对用户可见。这一层的事务,主要由用户来决定事务的发起与结束。事务生命周期由用户控制,是high-level的。

  也就是通常所说的事务块,transaction block。当用户发起:BEGIN, COMMIT, ROLLBACK, SAVEPOINT, ROLLBACK TO or>  PG的traffic cop会将这些call重新转发到Top Layer routine中,相对应的方法如下:
  BeginTransactionBlock
  EndTransactionBlock
  UserAbortTransactionBlock
  DefineSavepoint
  RollbackToSavepoint
  ReleaseSavepoint
  2.Middle Layer
  这一层基本上是语句级别的。对用户不可见,也就是说用户无法控制具体生命周期。这一层的处理是跟语句相对应的。由postgres.c处理,相对应的方法如下:
  StartTransactionCommand
  CommitTransactionCommand
  AbortCurrentTransaction
  3.Bottom Layer
  这是最低层的事务原子性的实现,是row-level级别的。是真正意义上的事务实现,以及嵌套事务处理等。
  相对应的方法如下:
  StartTransaction
  CommitTransaction
  AbortTransaction
  CleanupTransaction
  StartSubTransaction
  CommitSubTransaction
  AbortSubTransaction
  CleanupSubTransaction
  从上面三层模型,可以看出PG事务管理粒度由粗到细。调用由中层向底层调用。另外如果有用户级别的事务控制,如出现“BEGIN”等,则被postgres.c转发到top layer中。
  假设下面一个案例:
  1)        BEGIN
  2)        SELECT * FROM foo
  3)        INSERT INTO foo VALUES (...)
  4)        COMMIT
  那么相应的调用方法调用循序如下:
  /  StartTransactionCommand;
  /       StartTransaction;
  1)
  \       BeginTransactionBlock;
  \  CommitTransactionCommand;
  /   StartTransactionCommand;
  2) /        ProcessQuery;               
  \        CommitTransactionCommand;
  \       CommandCounterIncrement;
  /   StartTransactionCommand;
  3) /        ProcessQuery;               
  \        CommitTransactionCommand;
  \       CommandCounterIncrement;
  /  StartTransactionCommand;
  /   ProcessUtility;                 
  4)
  \   CommitTransactionCommand;
  \      CommitTransaction;
  在第一步中,用户定义的事务边界开始,也是此事务的生命周期起点。
  首先,”BEGIN”也是作为一个命令语句的,因此本身这一步也是需要middle layer中的方法调用将其包围起来。

  接着起动low-level事务,即由middle layer调用bottom layer的方法。StartTransaction时,会生成vxid(virtual transaction>  判断当前事务是否是read-only或者目前是否处于recovery状态。事务隔离级别,事务是否异步commit等信息都在这里初始化。将transState状态设置为:TRANS_INPROCESS。
  因为有“BEGIN”命令语句,所以是top layer的。因此又被转到BeginTransactionBlock逻辑中。开始transaction block 处理,并将事务状态设置为:TBLOCK_START。
  起transaction block和起transaction的区别在于对事务状态的设置不一样。
  start trasaction block是将事务状态设置为:TBLOCK_START,而一般的start transaction是将其设置为:TRANS_INPROCESS。
  事务块与事务是有区别的,在状态上。事务块有以下几种状态,是可以嵌套的:
DSC0000.png

  而一般事务,只有以下几种状态,没有嵌套:
DSC0001.png

  另外,在源码定义上,用了不同的结构体来保存。TransState,保存low-level事务状态。
  而TBlockState保存high-level事务状态。从这里也明显可以看出,PG在事务层级上做了区分的。
DSC0002.png

  在第二步中,发起select查询。上面讲过,middle layer是跟命令语句对应的。因此针对select 查询,也是用middle layer中的方法调用将其包围。
  另外增加CID,用于同一事务中的MVCC可见性判断。
  在第三步中,发起insert操作。这一步大逻辑上基本上等同于第二步。只是在处理insert时,需要将当前的xid更新到tupler header中去。
  通常涉及到insert,update,delete等操作都是跟heap紧密相关,涉及到heap的物理上tuple新增和删除。在这一层中,PG需要为每一个DML
  操作assign一个事务ID,并将此事务ID更新到tuple header中的xmin或者xmax中。从而实现MVCC。另外这一层也会增加commandID,主要用来实现同一事务中的可见性判断。
  在第四步中,用户发起commit,提交事务。事务生命周期结束。这一步逻辑等同于第一步。这里不仅需要结束top layer 的transaction block。也需要结束low-level中的事务,实现
  事务原子性。另外还需要释放资源,释放buffer pin,释放锁等。
  从上面的讲解中,我们可以比较清晰的看到,PG在事务实现的大致逻辑。完整实现ACID功能。
  Atomity:原子性由low-level级别实现,从StartTransaction开始,结束于CommitTransaction。
  Consistency:一致性由语句级别实现,即middle layer对应。另外在tuple header 中更新的xmin,xmax,cmin,cmax为事务可见性提供判断基础。
  Isolation:在StartTransaction时,初始化事务隔离级别。为MVCC创建snapshot时,提供基础。
  Duarability:通过CommitTransaction实现,提交事务日志等。为数据恢复和持久化提供基础。实现WAL(Write Ahead Log)功能。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-317319-1-1.html 上篇帖子: PostgreSQL中如何对应SQL Server中的rowversion 下篇帖子: 利用pgpool-II搭建postgresql集群的并行查询模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表