在分布式系统中,事务往往包含了多台数据库上的操作。多台数据库之间的原子性,需要通过两阶段提交协议来实现。

两阶段提交协议的步骤:

(1)应用程序调用事务协调器中的提交方法。

(2)事务协调器将联络事务中涉及的所有数据库,通知它们准备提交事务(PREPARE TRANSACTION)。

(3)数据库收到通知后,确保后续在被要求提交事务时能提交,或在被要求回滚事务时能回滚,则返回成功,否则返回失败。

(4)事务协调器接收所有数据库的响应。

(5)如果所有数据库都响应成功,则向各个数据库发送提交命令(COMMIT PREPARED)。如果任一数据库返回失败,则向各个数据库发送回滚命令(ROLLBACK PREPARED)。

下面用实例演示两阶段提交协议。

1.设置参数

修改postgresql.conf文件中的max_prepared_transactions为10,如果没有设置这个参数,则不能使用两阶段提交。

 set max_prepared_transactions=10;

2.建表

 CREATE TABLE person (id  int primary key, name varchar(20)
);

3.准备提交事务

使用“PREPARE TRANSACTION ”准备提交事务(第一阶段)。

'person_1'是两阶段提交中全局事务的ID,由事务协调器生成。PostgreSQL数据库成功执行这条命令后,就会把该事务持久化。即使数据库重启,该事务既不会回滚,也不会丢失。

mydb=# begin;
BEGIN
mydb=# insert into person values(1,'April');
INSERT 0 1
mydb=# prepare transaction 'person_1';
PREPARE TRANSACTION 

4.重启数据库

pg_ctl 用于启动、停止、重启 PostgreSQL 后端服务器。参数 -D 声明该数据库的文件系统位置,如果忽略则使用 PGDATA 环境变量。PGDATA表示缺省数据目录位置。

pg_ctl stop -D $PGDATA
pg_ctl start -D $PGDATA

5.提交事务

重启后,使用“COMMIT PREPARED”真正提交事务(第二阶段)。

mydb-# commit prepared 'person_1';
COMMIT PREPARED

6.查询数据

select * from person;

由此可见,一旦成功执行“PREPARE TRANSACTION”命令,事务就会被持久化,即使重启数据库,仍然可以提交这个事务。

PostgreSQL中的两阶段提交相关推荐

  1. 星巴克不使用两阶段提交

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/6dyh 译者序 本文翻译自 2004 ...

  2. MySQL 为什么需要两阶段提交?

    文章目录 1. 什么是两阶段提交 1.1 binlog 与 redolog binlog redo log 1.2 两阶段提交 2. 为什么需要两阶段提交 3. 小结 为什么要两阶段提交?一阶段提交不 ...

  3. 详解PostgreSQL数据库中的两阶段锁

    点击上方"蓝字" 关注我们,享更多干货! 数据库中的对象是共享的,假如不同的用户同时修改某个对象,就会出现数据错乱,从而破坏数据库的数据一致性,违反事务的隔离性原则. 为了满足隔离 ...

  4. 【Elasticsearch】使用两阶段提交在 Elasticsearch 中模拟事务功能

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 文章目录 0.概述 1.介绍 2.概述 3.什么是两阶段提交协议 4.两阶段提交实现的高级概述 5.创建 ...

  5. 两阶段提交实际项目V1

    项目介绍 两阶段提交项目主要是实际用代码演示复现一下,两阶段提交的执行过程,仅供学习参考.本次主要分析的版本为V1版本,主要实现的流程包括服务端的基础架构编写,客户端的基础架构编写,完成事务提交的过程 ...

  6. 两阶段提交(Two-Phase Commit)

    两阶段提交 两阶段提交是一种同步协议,是计算机网络尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中保持原子性和一致性而设计的一种算法. 两阶段提交的执行过程 在两阶段提交 ...

  7. mongodb mysql 事务_MongoDB数据库两阶段提交实现事务的方法详解 _ 蚂蚁视界

    本文实例讲述了MongoDB数据库两阶段提交实现事务的办法.分享给年夜家供年夜家参考,详细如下: MongoDB数据库中操作单个文档老是原子性的,然而,涉及多个文档的操作,通常被作为一个"事 ...

  8. 提交mysql代码_MySQL源码之两阶段提交

    在双1的情况下,两阶段提交的过程 环境准备:mysql 5.5.18, innodb 1.1 version 配置: sync_binlog=1 innodb_flush_log_at_trx_com ...

  9. MySQL调优(七):滴滴一面二面题,服务器参数设置,redolog两阶段提交

    某同学的滴滴一面二面 1.自我介绍不要念稿 2.对项目描述要准确,不要看起来不懂装懂:态度问题.一些问题没接触过很正常.不要所有问题都抢着说,要展示态度. 服务器参数设置 thread_cache_s ...

最新文章

  1. PCL:点云配准1、基础知识:平面3自由度、旋转矩阵精讲
  2. OpenLayer + Ags 综合应用(一)--OpenLayer 地图展现
  3. 显示一个数字到小数点后两位
  4. Java数据库——事务处理
  5. 吸水间最低动水位标高_消防水泵-吸水管路设置要求
  6. 安装Mathcad过程中的问题——解决无法将注册值写入注册表
  7. Leetcode--329. 矩阵中的最长递增路径
  8. 计算机软考培训网校,计算机软考培训中心
  9. 信息学奥赛C++语言:判断两位数
  10. vue routes路由
  11. 测试mysql主从_MySQL主从介绍、配置主从、测试主从同步
  12. OpenCasCade——将鼠标点的位置转换为基于OCC三维坐标系中在某一面上的坐标
  13. 《阵列信号处理及MATLAB实现》绪论、矩阵代数相关内容总结笔记
  14. 微信测试公众号如何进行支付测试
  15. 小小丁出生——有图有真相
  16. vue2.0模板的三种写法
  17. java 泛型中的上界(extend)和下界(super)
  18. dn什么意思_DN是啥意思
  19. 与 vmx86 驱动程序的版本不匹配解决方法
  20. python pyz_Python pyzgoubi包_程序模块 - PyPI - Python中文网

热门文章

  1. hadoop 2.7.7 百度网盘下载链接
  2. [日语二级词汇]日语二级必会汉字总结3
  3. scrapy爬取起点小说网
  4. IDEA--输入法无法输入中文
  5. 系统间数据交互的方案探讨
  6. 计算机组成位模式,Pentium的工作模式-计算机组成原理与汇编语言-电子发烧友网站...
  7. 技术英语单词中英文对照
  8. 高中信息技术初知计算机网络教案,高中信息技术选修3教案-1.1 初识计算机网络-浙教版...
  9. C/C++程序员必读的十本书
  10. 基于密码技术的应急广播安全解决方案