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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

标签

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/

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 Serverless 分布式数据库
【公测】PolarDB PostgreSQL版Serverless功能免费使用​!
【公测】PolarDB PostgreSQL版Serverless功能免费使用​,公测于2024年3月28日开始,持续三个月,公测期间可以免费使用!
|
存储 关系型数据库 数据库
深入了解 PostgreSQL:功能、特性和部署
PostgreSQL,通常简称为Postgres,是一款强大且开源的关系型数据库管理系统(RDBMS),它在数据存储和处理方面提供了广泛的功能和灵活性。本文将详细介绍 PostgreSQL 的功能、特性以及如何部署和使用它。
1416 1
深入了解 PostgreSQL:功能、特性和部署
|
存储 SQL 关系型数据库
MySQL事务处理:如何确保数据一致性与可靠性
事务(Transaction)是数据库管理系统(DBMS)中的一个核心概念。MySQL 事务是指**一组数据库操作**,作为一个整体进行处理,确保要么全部成功,要么全部失败。
493 15
MySQL事务处理:如何确保数据一致性与可靠性
|
关系型数据库 Serverless 分布式数据库
PolarDB PostgreSQL版Serverless功能上线公测啦,公测期间免费使用!
Serverless数据库能够使得数据库集群资源随客户业务负载动态弹性扩缩,将客户从复杂的业务资源评估和运维工作中解放出来。PolarDB PostgreSQL版 Serverless提供了CPU、内存、存储、网络资源的实时弹性能力,构建计算与存储分离架构下的 PolarDB PostgreSQL版产品新形态。
|
存储 SQL Oracle
02-PostgreSQL 存储过程的进阶介绍(含游标、错误处理、自定义函数、事务)
02-PostgreSQL 存储过程的进阶介绍(含游标、错误处理、自定义函数、事务)
|
SQL 关系型数据库 分布式数据库
在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能,而不是使用IF函数
在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能,而不是使用IF函数
238 7
|
SQL 关系型数据库 分布式数据库
在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能
在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能【1月更文挑战第13天】【1月更文挑战第65篇】
178 2
|
Cloud Native 关系型数据库 MySQL
PolarDB MySQL企业版:云原生架构,超高性能与可靠性的完美结合
在数字化时代,数据已成为企业的核心资产。对于现代企业来说,选择一款高性能、高可靠性、高性价比的数据库至关重要。阿里巴巴自研的云原生HTAP数据库——PolarDB MySQL企业版,正是这样一款满足企业需求的理想选择。
579 1
|
关系型数据库 Linux Shell
Centos系统上安装PostgreSQL和常用PostgreSQL功能
Centos系统上安装PostgreSQL和常用PostgreSQL功能

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多