标签

PostgreSQL , 10.0 , 2PC , txid_status , unknown事务


背景

在一些极端情况下,例如当客户端发出事务提交SQL后,客户端收到数据库返回的提交状态前,如果客户端崩溃或数据库异常,导致客户端不知道事务的最终状态到底是提交成功还是失败的。

那么怎么解决这个问题呢?

1. 一种方法是走2PC协议,先使用预提交,然后在发出commit 之前的预提交。(因为只要预提交成功,就可以认为后面的commit是一定可以成功的),从而来避免unknown的事务问题。

但是2PC引入了性能的问题,因为需要和数据库交互多次。

2. 10.0引入一个新的功能,查看以往的事务提交状态。在发生崩溃问题后,应用程序再起来之后,可以通过事务号,查到事务的提交状态。杜绝unknown的事务。

为了查询事务状态,应用程序必须要保留事务号,目前PostgreSQL通过txid_current()可以查询当前的事务号,结合insert ,update,... returning txid_current(),可以在一次交互中得到这个事务号。从避免因为这个功能引入的增加一次交互。

未来PostgreSQL可能会在驱动层面解决这个问题,减少业务程序的开发工作量(使用txid_current()获得事务号)。

Issuing a “multi-statement query”,
e.g. INSERT INTO ...; SELECT txid_current(); if it doesn’t need the result of the prior query;  Combining it with another query,
e.g. INSERT INTO ... RETURNING txid_current();  Using client driver support for batching queries to dispatch the txid_current() query along with other queries without waiting for a reply for each query.  In a future version PostgreSQL may automatically report the transaction ID when it is assigned to make this easier for applications.

例子

SELECT txid_status(BIGINT '63204');  txid_status的参数是xid, 即txid_current()的返回值类型。  注意不是int32, 是int64哦。

patch如下

Add a txid_status function.  author Robert Haas <rhaas@postgresql.org>
Sat, 25 Mar 2017 00:00:53 +0800 (12:00 -0400)
committer   Robert Haas <rhaas@postgresql.org>
Sat, 25 Mar 2017 00:00:53 +0800 (12:00 -0400)
commit  857ee8e391ff6654ef9dcc5dd8b658d7709d0a3c
tree    1d0f54ef032aa0a90bcda70e86ee3850167462ad    tree | snapshot
parent  42b4b0b2413b9b472aaf2112a3bbfd80a6ab4dc5    commit | diff
Add a txid_status function.  If your connection to the database server is lost while a COMMIT is
in progress, it may be difficult to figure out whether the COMMIT was
successful or not.  This function will tell you, provided that you
don't wait too long to ask.  It may be useful in other situations,
too.  Craig Ringer, reviewed by Simon Riggs and by me  Discussion: http://postgr.es/m/CAMsr+YHQiWNEi0daCTboS40T+V5s_+dst3PYv_8v2wNVH+Xx4g@mail.gmail.com

这个patch的讨论,详见邮件组,本文末尾URL。

PostgreSQL社区的作风非常严谨,一个patch可能在邮件组中讨论几个月甚至几年,根据大家的意见反复的修正,patch合并到master已经非常成熟,所以PostgreSQL的稳定性也是远近闻名的。

参考

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=857ee8e391ff6654ef9dcc5dd8b658d7709d0a3c

https://blog.2ndquadrant.com/traceable-commit-postgresql-10/

PostgreSQL 10.0 preview 功能增强 - 更强可靠性, 过去式事务状态可查(杜绝unknown事务)...相关推荐

  1. PostgreSQL 10.0 preview 功能增强 - 后台运行(pg_background)

    标签 PostgreSQL , 10.0 , 后台运行 , pg_background_launch , pg_background_result , pg_background_detach , p ...

  2. PostgreSQL 10.0 preview 功能增强 - 支持EUI-64格式MAC地址类型

    标签 PostgreSQL , 10.0 , eui-64 , mac 背景 PostgreSQL 是全球最先进的开源数据库,所谓先进,体现在很多方面: 支持扩展类型 支持扩展操作符 支持扩展函数 支 ...

  3. PostgreSQL 10.0 preview 主动防御 - 禁止执行全表删除、更新(可配置)

    标签 PostgreSQL , 10.0 , 主动防御 , 是否允许执行不带where条件的update\delete 背景 你是否曾经被不带where 条件的SQL误伤过呢? 比如 update t ...

  4. 元旦技术大礼包 - 2017金秋将要发布的PostgreSQL 10.0已装备了哪些核武器?

    标签 PostgreSQL , 10.0 , 金秋 , 元旦 , 大礼包 , commitfest 背景 早上送给大家的新年大礼包,一年一个大版本是PostgreSQL社区的传统,虽然发布时间通常为秋 ...

  5. PostgreSQL · 实现分析 · PostgreSQL 10.0 并行查询和外部表的结合

    前言 大家都知道,PostgreSQL 近几大版本中加入了很多 OLAP 相关特性.9.6 的并行扫描应该算最大的相关特性.在今年发布的 10.0 中,并行扫描也在不断加强,新增了并行的索引扫描. 我 ...

  6. excel小写转大写公式_谁说WPS干不过Excel?这几个功能WPS更强

    Office是办公软件的鼻祖,功能更强大完善.但是职场中,不少人使用的是WPS.WPS这款办公软件的设计考虑到中国人的使用习惯,所以有一些Excel比不上的好用功能. 俗话说"白猫黑猫抓到老 ...

  7. [惊!] IE 10.0,你没看错! IE10 Platform Preview 1出来啰~

    你还没安装上 IE 9.0吗?那真的逊! 因为..... IE 10.0已经有 Preview版本给人下载啰!!!!! 下载 IE10 Platform Preview 1    (2011/4/12 ...

  8. 程序员快放弃 Android 9.0 吧,10.0 正在来的路上!

    本文经授权转自终端研发部(ID:codeGoogler) 目前,美国 Google公司的 AndroidP (安卓9.0),已经正式全面推出有几个多月了.众多手机品牌厂商也都在积极的进行更新适配 An ...

  9. 还在期待安卓9.0吗?Android 10.0要来了

    目前,美国 Google公司的 AndroidP (安卓9.0),已经正式全面推出有几个多月了.众多手机品牌厂商也都在积极的进行更新适配 Android 9.0 系统(修改UI界面也算是二次开发,嗯) ...

最新文章

  1. 青源 LIVE 第 28 期 | 北大燕博南:下一代AI芯片—存内计算的硬核与软着陆
  2. 一篇为你讲透Yii2的widget这货
  3. 中国无人驾驶货运完成横穿全美壮举!智加重卡,历经昼夜端到端运送生鲜
  4. 编程 ul 不能一行显示 跳到下行_单片机编程魔法之三权分立
  5. 【项目经理之修炼(7)】《基础篇》人生游戏中的神器——谦虚
  6. SQL update select结合语句详解及应用
  7. Loj#2035-[SDOI2016]征途【斜率优化】
  8. 站长如何屏蔽流氓宽带商在你的页面里面强行插入的广告代码
  9. [极客大挑战 2019]PHP
  10. microsoftsql新建登录用户登录失败_史上最简单的Spring Security教程(九):自定义用户登录失败页面...
  11. linux 提取有效源码,MPSOC之4——petalinux提取源码
  12. Django ImportError: Settings cannot be imported
  13. 可以做技术,切不可沉湎于技术,大家怎么看?
  14. java如何代码生成矩形_Java中能不能创建不是矩形的窗口。
  15. 中文乱码问题:JSP页面的显示问题,获取中文参数值问题
  16. java贪吃蛇总结报告_java贪吃蛇开发总结
  17. 使用Idea合并svn分支到主干上
  18. 电阻 电容 电感 磁珠的选型总结对比
  19. 微信开通检测软件的使用方法(入门教程)
  20. js 选择本地图片并显示

热门文章

  1. java设置打印机默认纸张_java 打印设置打印A4 A5纸
  2. MOG插件(葡萄牙语,略作翻译)
  3. 《数据结构与算法之二叉搜索树(Java实现)》
  4. 同一局域网内的其他电脑访问我的电脑本地的网站
  5. Era of nostalgia?(怀旧时代的到来?)
  6. OD常用断点函数(转载)
  7. matlab三维曲线的绘制
  8. 保监会:保险机构应坚持长期投资
  9. hdu3397 线段树
  10. Spring 文件路径