背景

数据库的事务是原子操作,要么成功,要么失败。但是实际上在客户端的视角,可能有第三种状态:unknown状态。

当客户端提交事务结束(rollback , commit , prepare xact , rollback pxact , commit pxact)的请求后,数据库收到请求,数据库可能执行失败,也可能执行成功,不管怎样都要写对于的WAL日志,还有CLOG,然后数据库要将执行结果返回给客户端ACK。

这里存在几种可能,导致客户端不知道执行到底怎么样了?

收到客户端请求后,数据库没有返回任何ACK给客户端,客户端对这次请求很茫然,它只能人为数据库处于UNKNOWN的状态。

UNKNOWN 事务的处理

unknown事务,就是客户端没有收到commit/rollback ACK的事务。不知道是成功还是失败。

多节点(quorum based sync replication)与单节点都可能出现UNKNOWN事务,效果、形态一致。

如何处理unknown事务呢?

unknown事务分为以下几种情况.

rollback , commit , prepare xact , rollback pxact , commit pxact 几种情况的unknown处理方法:

1、两阶段解决unknown状态问题

prepare 阶段unknown, 切换leader后,客户端通过pg_prepared_xacts视图检查prepare xact状态,如果没有prepare xact则说明失败了,那么整个事务重新发起即可。如果prepare xact存在,说明prepare xact成功了。

commit or rollback prepare xact阶段unknown, 切换后检查prepare xact状态,存在则重试commit or rollback prepare xact。不存在则说明已经成功(我们认为2PC是一定成功的),无须处理。

2、非两阶段事务,rollback unknown无须处理,rollback失败或成功对于客户端来说结果是一样的。因为不管怎样都会回滚掉,这是数据库原子性保障的。

3、非两阶段事务,commit unknown处理,极度严谨的场景,程序可以设计事务状态可回溯,例如:

事务开始时,记录事务号或唯一流水号,事务号在数据库中是一个唯一的流水,可以根据事务号查询它的状态,比如postgresql。

但是并不是所有数据库都有这种接口,比如非物理流式复制的数据库,则可以在事务中增加全局唯一流水号来查看事务是否提交。这里利用了事务的原子特性,既要么全成功要么全失败。可以举个使用例子。

使用业务流水实现事务状态判断的例子:

begin;

生成唯一业务流水ID, 写入到某个流水表,同时在程序或其他数据库中记录这个流水号,备查。

执行事务

提交事务;

-- 出现unknown

通过唯一业务流水ID,查询数据库中是否存在这条记录。

如果不存在,说明事务提交失败。

如果存在,说明事务提交成功。(因为数据库的事务是原子操作)

pgsql数据库默认配置事务类型_PostgreSQL数据库事务出现未知状态的处理方法相关推荐

  1. pgsql数据库默认配置事务类型_postgreSql最佳配置详解(connection 申请、回收策略)...

    一.引子 合理配置一个应用的数据库参数,使其运行良好,这很重要.本文以某务中台的生产环境为例,从Apollo上拔下来一套配置,分析是否合理. 二.MybatisPlus配置 由于我们使用Apollo配 ...

  2. mysql数据库中常用的类型_MySQL数据库中常用字段类型

    MySQL数据库中常用字段类型 整数型:TINYINT,SMALLINT,INT,BIGINT 小数型:FLOAT,DOUBLE,DECIMAL(M,D) 字符型:CHAR,VARCHAR 日期型:D ...

  3. 【DBMS 数据库管理系统】数据库 -> 数据仓库 ( 数据处理类型 | 传统数据库 | 数据库不适用于分析型应用 )

    文章目录 一.数据处理类型 二.传统数据库技术 三.传统数据库 不适用于 分析型 ( DSS 决策支持系统 ) 应用 原因 四.事务性处理 与 分析型处理 性能特性不同 五.数据集成问题 六.数据集成 ...

  4. pgsql数据库默认配置事务类型_PostgreSQL基础教程之:初始化配置

    PostgreSQL基础教程之:初始化配置 时间:2020-04-27 来源: PostgreSQL基础教程之:初始化配置 一.配置pg_hba.conf 先说明客户端认证配置文件pg_hba.con ...

  5. HBase数据库默认配置参数

    配置参数 默认参数值 描述 hbase.tmp.dir ${java.io.tmpdir}/hbase-${user.name} 本地文件系统的零时目录 hbase.rootdir ${hbase.t ...

  6. mysql数据库表中的类型_MySQL数据库中表类型MyISAM与InnoDB的区别

    MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...

  7. vertica 数据库 linux,配置访问列式数据库vertica的php环境

    vertica是一个和Sybase IQ,infobright类似的列式数据库,没有用过Sybase IQ,就和infobright 3.4的社区版做了简单对比测试,在同样一个一亿条记录的表中,下面的 ...

  8. 数据库设计中String类型的数据库类型选择

    在java中,对于String 类型的字段,我们在设计数据库的时候,会有两个选择,一个char,一个varchar,那我们应该怎么选择呢? 我们先来看一下char和varchar的区别: char是定 ...

  9. 新装的mysql数据库默认密码是多少_数据库的设置及其初始密码

    Microsoft Windows [版本 10.0.14393] (c) 2016 Microsoft Corporation.保留所有权利. C:\Users\Administrator>n ...

最新文章

  1. 机器学习入门学习笔记:(3.1)决策树算法
  2. PING检查网络是否畅通
  3. Android使用PorterDuffXfermode实现遮罩效果
  4. 阻碍企业数字化转型的十个“拦路虎”
  5. “strcpy” 模拟的实现
  6. 【Calcite】CHAR(1) CHARACTER SET “ISO-8859-1“ COLLATE “ISO-8859-1$en_US$primary“ NOT NULL
  7. cusparseScsrsv_analysis函数导致内存暴涨问题
  8. Open3d之对点云进行DBSCAN 聚类
  9. 计算理论笔记 9月27日
  10. 医疗管理核心制度之 十八、信息安全管理制度
  11. VBScript编程教程 [下]
  12. Linux内核4.14版本——GPIO子系统(2)——gpio control driver分析
  13. 获取计算机用户名 方法
  14. 可以上qq不能上网页的解决办法
  15. 新版白话空间统计(3):空间分布模式
  16. 解码mmo游戏服务器二:地图自动寻路
  17. Web应用十大安全漏洞
  18. 给toB创业程序员的建议
  19. 前端技术学习:语义化
  20. 多米诺骨牌——变形版0,1背包问题

热门文章

  1. 划分VLAN,根据每个VLAN通过DHCP分配IP地址
  2. Python中的numpy矩阵运算
  3. Oracle Pipelined Table Functions简介
  4. Go操作mysql实现增删改查及连接池
  5. Go微服务报错protoc-gen-go: unable to determine Go import path for
  6. PHP的Static与Global
  7. 用qss 来控制qlabel显示字体的位置_Word表格总填不好,这些技巧轻松来拯救
  8. tp的echo输出字符串后换行
  9. 微信小程序的点击复制功能
  10. MySQL实验四数据库的查询_MySQL数据库实验四:嵌套查询