postgreSQL——事务分析6

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的并发处理机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值