开发者社区> 德哥> 正文

为什么数据库事务会出现未知状态,如何处理

简介:
+关注继续查看

标签

PostgreSQL , unknown事务


背景

数据库的事务是原子操作,要么成功,要么失败。但是实际上在客户端的视角,可能有第三种状态: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,查询数据库中是否存在这条记录。  
如果不存在,说明事务提交失败。  
如果存在,说明事务提交成功。(因为数据库的事务是原子操作)  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
技术原理:MySQL数据库事务浅析
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaobryant/article/details/80539558 在SQL编程中,事务编程已然成为必不可少的一个组成部分。
2347 0
数据库事务隔离级别
一,事务的4个基本特征  Atomic(原子性): 事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要 么全部成功,要么全部失败。 Consistency(一致性): 只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态。
1256 0
SpringBoot2 整合JTA组件,多数据源事务管理
JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序对JTA的支持极大地增强了数据访问能力。
585 0
7、web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理
如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执行下去 1.
1264 0
Apache Flink 零基础入门教程(六):状态管理及容错机制
本文主要分享内容如下: - 状态管理的基本概念; - 状态的类型与使用示例; - 容错机制与故障恢复;
1164 0
Zabbix监控-mingodb数据库状态
最近公司数据库新增加了几台mongodb数据库,为了能实时了解运行的状态,需要增加zabbix对mongodb的运行状态监控。 mongodb默认安装情况下可以运行echo "db.serverStatus()" | mongo 来获取mongodb的运行状态,但是公司数据库安装的...
995 0
数据库事务ACID
数据库事务 数据库事务有严格的定义,它必须同时满足4个特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID。
920 0
Oracle数据库事务隔离级别概述
整理自Oracle 11g R2 官方文档 《concepts》 001 概述     Oracle数据库提供如下事务隔离级别:     ·已提交读隔离级别     ·可串行化隔离级别     ·只读隔离级别 002 读提交隔离级别2-1 概述     在(默认的)已提交读隔离级别中,事务中执行的每个查询,仅看到在查询 开始之前提交的数据——而不是事务开始之前提交的数据。
943 0
+关注
德哥
公益是一辈子的事, I'm digoal, just do it.
2153
文章
245
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
相关文档: 云数据库 OceanBase 版 可信账本数据库 云原生关系型数据库 PolarDB PostgreSQL引擎
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载