在分布式系统中,各个节点(或者事务参与方)之间在物理上相互独立,各节点之间无法确切地知道其它节点中的事务执行情况,所以多节点之间很难保证ACID,尤其是原子性。如果是单节点的事务,由于存在事务机制,可以保证其数据操作的ACID特性。如果要实现分布式系统事务的原子性,必须保证所有节点的数据写操作,要不全部都执行,要么所有节点全部都不执行。但是,一个节点在执行本地事务的时候无法知道其它节点的本地事务的执行结果,所以它就不知道本次事务到底应该commit还是 rollback。这就需要引入一个“协调者”的组件来统一调度所有分布式节点的执行。

两阶段提交原理

二阶段提交的算法思路可以概括为:协调者询问参与者是否准备好了提交,并根据所有参与者的反馈情况决定向所有参与者发送commit或者rollback指令。

所谓的两个阶段是指:

  • 准备阶段 又称投票阶段。在这一阶段,协调者询问所有参与者是否准备好提交,参与者如果已经准备好提交则回复Prepared,否则回复Non-Prepared。
  • 提交阶段 又称执行阶段。协调者如果在上一阶段收到所有参与者回复的Prepared,则在此阶段向所有参与者发送commit指令,所有参与者立即执行commit操作;否则协调者向所有参与者发送rollback指令,参与者立即执行rollback操作。

KingbaseES两阶段提交

  • prepare transaction transaction_id:prepare transaction 为当前事务的两阶段提交做准备。 在命令之后,事务就不再和当前会话关联了,它的状态完全保存在磁盘上, 它提交成功有非常高的可能性,即使是在请求提交之前数据库发生了崩溃也如此。这条命令必须在一个用BEGIN显式开始的事务块里面使用。
  • commit prepared transaction_id:提交已进入准备阶段的ID为transaction_id的事务
  • rollback prepared transaction_id:回滚已进入准备阶段的ID为transaction_id的事务

使用例子

设置数据库参数,确保 max_prepared_transactions 大于 0

  1. test=# alter system set max_prepared_transactions=100;
  2. ALTER SYSTEM

会话A:在prepare 后,全局事务ID 会保存到本地表中,即使数据库异常宕机也能恢复事务。

  1. test=# begin;
  2. BEGIN
  3. test=# create table tt1(id integer);
  4. CREATE TABLE
  5. test=# PREPARE TRANSACTION 'the first prepared transaction';
  6. PREPARE TRANSACTION
  7. test=# \q

会话B:

  1. test=# SELECT * FROM pg_prepared_xacts;
  2. transaction | gid | prepared | owner | database
  3. -------------+--------------------------------+-------------------------------+--------+----------
  4. 41207 | the first prepared transaction | 2022-04-27 17:33:12.411756+08 | system | test
  5. (1 row)
  6.  
  7. test=# ROLLBACK PREPARED 'the first prepared transaction';
  8. ROLLBACK PREPARED

  9. test=# SELECT * FROM pg_prepared_xacts;
  10. transaction | gid | prepared | owner | database
  11. -------------+-----+----------+-------+----------
  12. (0 rows)

注意:在运行 prepare transaction时,本地的事务就已经结束,后续的commit or rollback 不必在事务块里执行。

  1. test=# begin;
  2. BEGIN
  3. test=# create table tt1(id integer);
  4. CREATE TABLE
  5. test=# PREPARE TRANSACTION 'the first prepared transaction';
  6. PREPARE TRANSACTION
  7. test=# rollback;
  8. WARNING: there is no transaction in progress
  9. ROLLBACK

两阶段提交注意事项

  • PREPARE TRANSACTION transaction_id 命令后,事务状态完全保存在磁盘上。
  • PREPARE TRANSACTION transaction_id 命令后,事务就不再和当前会话关联,因此当前session可继续执行其它事务。
  • COMMIT PREPARED 和 ROLLBACK PREPARED 可在任何会话中执行,而并不要求在提交 prepare transaction 的会话中执行。
  • 不允许对那些执行了涉及临时表或者是创建了带WITH HOLD游标的事务进行PREPARE。 这些特性和当前会话绑定得实在是太紧密了,因此在一个准备好的事务里没什么可用的。
  • 如果事务用SET修改了运行时参数,这些效果在PREPARE TRANSACTION之后保留,并且不会被任何以后的COMMIT PREPARED或ROLLBACK PREPARED所影响,因为SET的生效范围是当前session。
  • 从性能的角度来看,把一个事务长时间停在准备好的状态是不明智的,因为它会影响VACUUM回收存储的能力。
  • 已准备好的事务会继续持有它们获得的锁,直到该事务被commit或者rollback。所以如果已进入准备阶段的事务一直不被处理,其它事务可能会因为获取不到锁而被block或者失败。

KingbaseES XA 分布式事务的更多相关文章

  1. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

  2. MySQL数据库分布式事务XA优缺点与改进方案

    1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...

  3. 分布式事务、XA、两阶段提交、一阶段提交

    本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规范 ...

  4. 关于分布式事务,XA协议的学习笔记

    XA分布式事务协议,包含二阶段提交(2PC),三阶段提交(3PC)两种实现. 1.二阶段提交方案:强一致性 事务的发起者称协调者,事务的执行者称参与者. 处理流程: 1.准备阶段 事务协调者,向所有事 ...

  5. DTP模型之一:(XA协议之三)MySQL数据库分布式事务XA优缺点与改进方案

    1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...

  6. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  7. Mycat 分布式事务的实现

    引言:Mycat已经成为了一个强大的开源分布式数据库中间件产品.面对企业应用的海量数据事务处理,是目前最好的开源解决方案.但是如果想让多台机器中的数据保存一致,比较常规的解决方法是引入"协调 ...

  8. 分布式事务之深入理解什么是2PC、3PC及TCC协议?

    导读 在上一篇文章<[分布式事务]基于RocketMQ搭建生产级消息集群?>中给大家介绍了基于RocketMQ如何搭建生产级消息集群.因为本系列文章最终的目的是介绍基于RocketMQ的事 ...

  9. 基于两阶段提交的分布式事务实现(UP-2PC)

    引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...

随机推荐

  1. Leetcode 1051. 高度检查器

    这题的目的是找出排序后和排序前位置不同的元素的个数 正常通过复制出一个新的数组,然后对比排序后的数组就能做出,但是时间是1ms 然后发现一种基于桶排序来计数的做法 public int heightC ...

  2. docker删除镜像报错 Error response from daemon: conflict: unable to delete f73fe6298efc (cannot be forced) - image has dependent child images

    方法1 docker rmi 镜像ID 方法2 docker rmi -f 镜像ID 方法3 docker rmi 镜像仓库名:tag

  3. Eclipse拷贝动态的web工程

    1.选中需要拷贝的工程,CTRL+C,然后CTRL+V 2.在web动态工程中,还需要选中新拷贝工程,右键选中properties,然后搜索web,--->Web Project Setttin ...

  4. dos命令-*02

    1.cmd状态下 tab快速补充文件名 ↑↓快速填充之前输入的文件名 2.//这是Java的快速入门 //对代码的相关说明 //1.public class Hello 表示Hello是一个类,是一个 ...

  5. 如何在Excel/WPS表格中批量查询快递信息?

    如何在Excel/WPS表格中批量查询快递信息? 干电商的小伙伴们还在为如何批量查询快递物流信息发愁吗?别着急,这篇文章或许能够帮助到您. 首先给大家看一下查询的具体成果: 第一步:安装Excel网络 ...

  6. 大数据--Hive的安装以及三种交互方式

    1.3 Hive的安装(前提是:mysql和hadoop必须已经成功启动了) 在之前博客中我有记录安装JDK和Hadoop和Mysql的过程,如果还没有安装,请先进行安装配置好,对应的随笔我也提供了百 ...

  7. angular变化检测OnPush策略需要注意的几个问题

    OnPush组件内部触发的事件(包括viewChild)会引起组件的一次markForCheck Detached组件内部触发的事件不会引起组件的变化检测 OnPush组件的contentChild依 ...

  8. Arraylist集合的概述和基本使用与常用方法

    什么是ArrayList类 java.util.ArrayList 是大小可变的数组实现的,存储在内的数据称为元素,此类提供一些方法来操作内部存储的元素.ArrayList中可不断添加元素,其大小也自 ...

  9. ExcelPatternTool: Excel表格-数据库互导工具

    ExcelPatternTool Excel表格-数据库互导工具 介绍: 指定Pattern文件-一个规则描述的json文档,基于此规则实现Excel表格与数据库之间的导入导出,校验等功能. 特点: ...

  10. gitlab root密码重置

    版本:Gitlab Ruby Gem 4.16.1 root密码在gitlab第一次运行的时候,如果你没有配置root用户的密码文件,它就会生成一个随机密码,并保存在固定的文件中,然后输出在屏幕上.但 ...