时间:2021-07-01 10:21:17 帮助过:36人阅读
PostgreSQL有自己的事务实现模型。总体上分为三层:top layer, middle layer和bottom layer。
PostgreSQL有自己的事务实现模型。总体上分为三层:top layer, middle layer和bottom layer。
1. Top Layer
Top Layer主要由用户控制,对用户可见。这一层的事务,主要由用户来决定事务的发起与结束。事务生命周期由用户控制,是high-level的。
也就是通常所说的事务块,transaction block。当用户发起:BEGIN, COMMIT, ROLLBACK, SAVEPOINT, ROLLBACK TO or RELEASE等命令时,
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) < ProcessUtility; << BEGIN
\ BeginTransactionBlock;
\ CommitTransactionCommand;
/ StartTransactionCommand;
2) / ProcessQuery; << SELECT ...
\ CommitTransactionCommand;
\ CommandCounterIncrement;
/ StartTransactionCommand;
3) / ProcessQuery; << INSERT ...
\ CommitTransactionCommand;
\ CommandCounterIncrement;
/ StartTransactionCommand;
/ ProcessUtility; << COMMIT
4) < EndTransactionBlock;
\ CommitTransactionCommand;
\ CommitTransaction;
在第一步中,用户定义的事务边界开始,也是此事务的生命周期起点。
首先,”BEGIN”也是作为一个命令语句的,因此本身这一步也是需要middle layer中的方法调用将其包围起来。
接着起动low-level事务,即由middle layer调用bottom layer的方法。StartTransaction时,会生成vxid(virtual transaction id,即backend id与local transaction id)。
判断当前事务是否是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。
事务块与事务是有区别的,在状态上。事务块有以下几种状态,是可以嵌套的:
------------------------------------华丽丽的分割线------------------------------------
CentOS 6.3环境下yum安装PostgreSQL 9.3
PostgreSQL缓存详述
Windows平台编译 PostgreSQL
Ubuntu下LAPP(Linux+Apache+PostgreSQL+PHP)环境的配置与安装
Ubuntu上的phppgAdmin安装及配置
CentOS平台下安装PostgreSQL9.3
PostgreSQL配置Streaming Replication集群
如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin
------------------------------------华丽丽的分割线------------------------------------
PostgreSQL 的详细介绍:请点这里
PostgreSQL 的下载地址:请点这里
本文永久更新链接地址: