2021@SDUSC
目录
概述
关系型数据库经典的两阶段提交协议在postgreSQL中的实现原理。
两阶段提交
查看文档发现PostgreSQL使用两阶段提交来支持分布式数据库的事务处理。
在分析postgreSQL事务处理之前,先回顾一下典型分布式数据库事务处理:
A在银行1的账户上有$100.
B在银行2的账户上有$50.
A转账$25给B.
如果“转账”的动作由于某些原因失败,A和B的账户应该不会发生改变。
但是由于银行1和银行2的数据库不同,简单直接地进行事务处理无法满足要求,因为“A转账$25给B”的操作可以分解为三个步骤:
1) A的账户减去25。
2) A发消息给B,要求B的账户增加25。
3) B的账户增加25。
现在假设步骤1和2都完成了,其中A所在的数据库已完成提交操作,这时步骤3由于某种原
因执行失败,然后退出事务,这时候显然转账失败,即出现对账不平现象。假如此时B再发消息给
A,要求A进行减去25的操作,但由于某种原因,A进行该操作时也失败了,怎么办呢?出现这种
现象的根本原因在于“A转账$25给B”操作不具有原子性,这时候就需要用到分布式数据库的事
务处理。实现分布式事务处理的关键就是两阶段提交协议。
但是我通过查阅文档了解到,PostgreSQL 只是支持分布式数据库中的两阶段提交协议,即给其提供了相关的操作接口,但并没有实现整个协议,两阶段协议的整个流程是由编程者实现的。所以下面叙述的两个过程是两阶段协议的内容,PostgreSQL 提供了最基本的操作接口。
预提交阶段
两阶段提交协议的第一个过程是预提交阶段,协议规定其执行步骤如下:
预提交阶段
1)对于分布式事务,某-一个事务所在的数据库管理系统会被选择成为“协调者”。协调者在本地开始一个分布式事务,并且向其他数据库管理系统发送“Prepare" 消息。发送消息时,会使用专门的事务ID (GID) 来标识此分布式事务。这样数据库管理系统之间可以确定需要同步执行的事务。
2)其他数据库管理系统接收到“Prepare”消息后,会试图开始一个本地事务以完成分布式事务的功能。它自行决定这个事务是提交还是终止,然后把它的决定发送给协调者。
3)如果数据库决定提交上述的一个本地事务,它就进入“预提交”阶段。在此阶段,如果协调者没有发送终止的消息,它不能终止这个本地事务。
4)如果数据库决定终止这个事务,它会向协调者发送取消的信息。然后由协调者进行全局性。
的取消动作。
在预提交阶段,各个分布式数据库系统将检查当前各自事务的情况,试图保证这个本地事务如果执行,就不会被终止。即使因系统出错而需要进行系统恢复,与这个事务相关的恢复操作也是应该Redo而不是Undo。 该重做而不是撤销。
在PostgreSQL系统中,当用户决定为当前事务做两阶段提交的准备时,利用命令PREPARE 在TRANSACTION可以完成。执行该命令时会调用PrepareTransaction 函数,该函数的流程同Start- 事务可以完成。只不过其中插人了StartPrepare 函数和EndPrepare函数,前者构建两阶段提交的相关记录的头部信息,后者完成记录数据信息的填充,并刷新到磁盘上。
全局提交阶段
两阶段提交协议的第二个过程是全局提交阶段,协议规定其步骤如下: 两阶段提交协议的第二个过程是全局提交阶段,协议规定其步骤如下:
1)如果协调者没有收到消息,就默认收到了“取消”消息。如果其他数据库返回给协调者的消息都是“Ready",协调者将提交这个分布式事务,然后把“Commit”消息发送给其他数据库。 如果协调者收到一条“取消”消息,则取消这个分布式事务,然后发送消息进行全局性的取消动作。
2)本地数据库根据协调者的消息,对本地事务进行COMMIT或者ABORT操作。在这个阶段,各个分布式数据库系统将进行事务的实质提交或者退出操作。 在这个阶段,各个分布式数据库系统将进行事务的实质提交或者退出操作。在PostgreSQL系统中,当用户准备提交一个早先为“两阶段提交”准备好的事务时,通过输入命令COMMIT PREPARED可以完成,执行该命令时会调用函数FinishPreparedTransaction,它首先读取磁盘上先前预提交阶段所记录的信息,然后调用RecordTransactionCommitPrepared完成事务的最终提交操作。
如果用户决定取消一个先前为两阶段提交准备好的事务,则通过命令ROLLBACKPREPARED可以完成。执行该命令时它也会调用FinishPreparedTransaction 函数,即首先读取磁盘上先前预提交可以完成。
两阶段提交协议是分布式数据库系统中保证分布式事务ACID特性的经典解决方案。PostgreSQL为其提供了很好地操作接口,应用程序开发者利用该操作接口可以很好地实现该协议。
总结
这周基本结束了postgreSQL的事务分析工作,下一个阶段将要分析postgreSQL的并发处理机制。