博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PGXC两阶段提交与事务一致性(1)
阅读量:6908 次
发布时间:2019-06-27

本文共 1281 字,大约阅读时间需要 4 分钟。

PGXC是一个基于PostgreSql 构建的分布式数据库,通过Sharding的方式将数据分布在不同的数据库实例中。

PG-XC的系统架构包含:Global Transaction Manager (GTM)、Coordinater(简称CN)、Datanode(简称DN)

其中GTM 为两阶段事务分配全局的XID和 Snapshot;CN是统一的服务入口,具有数据分布的整体视图;DN存储实际的数据,一般按照哈希值进行数据分布,分别存储在不同的DN节点。

先来看一下,PGXC如何保证事务的强一致

假设有一张表以及定义在这个表上的一个事务运行在包含2个CN和2个DN的系统上:

create table account (id int , name varchar(32), money int);

1  张三  10;

2 李四   20;

start transaction;

update account money - 10 where name = '张三';

update account money + 10 where name = '李四';

end transaction;

事务隐含的一致性约束是 张三和李四的money 之和是30,假如恰好这2条数据分别分布在DN的2个Shard上,那么执行这个事务需要启动2阶段提交。

PG的事务引擎,通过全局的Snapshot来做可见性判断,而且PG的XID是逻辑意义上的序列号。正常情况下为了保证强一致性,执行的CN节点需要先

从GTM获取全局的Snapshot和GXID,然后下发到DN节点执行:

DN1: update account money - 10 where name = '张三';

DN2:update account money + 10 where name = '李四';

2个DN执行完之后再将事务的提交状态上报给GTM;

而且,一旦2阶段事务残留,pgxc_clean可以通过GXID分别找的CN、DN上的两阶段事务,即使执行的CN节点出现宕机的情况,还是可以通过GTM

上持久化的GXID来找到各个节点上残留的2阶段事务并进行清理,使数据库恢复一致性的状态。不过可以看出在这个过程中CN节点和其他参与2阶段事务

的节点与GTM之间需要经过多次通信,必然会影响执行的效率。如果对事务的一致性要求不严格的场景下可以考虑不使用全局的GXID和Snapshot,都使用

各自节点的local xid,这样就不用与GTM进行通信,当然由于各个节点的local xid都不一致,还需要设置一个统一的Txn来串联起各个节点上的事务,以便

做2阶段事务清理。

典型的DML处理流程如下:

 

2阶段事务的状态都持久化到了CN1节点上,pgxc_clean清理的时候,在DN1和DN2上通过解析出CN1节点和xid,然后到CN1节点上查询事务的状态来决定事务继续提交还是回滚。

 

转载于:https://www.cnblogs.com/databaseaffair/p/6864070.html

你可能感兴趣的文章
Error_GL_KeyflexfieldDefinitionFactory.getStructureNumber无法找到应用产品
查看>>
js作用域及闭包
查看>>
CSS overflow 属性
查看>>
通过改变uiview的layer的frame来实现进度条
查看>>
ADB am 命令详细参数
查看>>
NOIp 数学基础
查看>>
nginx支持ipv6
查看>>
点名器
查看>>
Codeforces Problems-122A. Lucky Division
查看>>
移动端适配代码
查看>>
Js设置所有连接是触发/swt/的代码
查看>>
JS高级程序设计2nd部分知识要点1
查看>>
mac10.8 更新系统出错
查看>>
'-[UITableViewController loadView] loaded the "XXX" nib but didn't get a UITableView.'
查看>>
ARM裸板开发:07_IIC 通过IIC总线接口读写时钟芯片时间参数实现的总结
查看>>
C# 笔记 如何调用一个有返回值的方法
查看>>
加载静态文件,父模板的继承和扩展
查看>>
高科技犯罪:东欧ATM取款机惊现木马!
查看>>
黑客大赛苹果及微软操作系统均被攻破
查看>>
自由职业者和外包接单项目分析
查看>>