软件下载吧文章资讯

分类分类

PostgreSQL事务回卷实战案例详析

2024-02-03 17:42作者:下载吧

背景

前阵子某个客户反馈他的RDS PostgreSQL无法写入,报错信息如下:

postgres=# select * from test;
 id 
—-
(0 rows)

postgres=# insert into test select 1;
ERROR:  database is not accepting commands to avoid wraparound data loss in database "xxxx"
HINT:  Stop the postmaster and vacuum that database in single-user mode.
You might also need to commit or roll back old prepared transactions.

随后RDS工程师介入处理以后,该问题立马得到了解决。

XID基础原理

XID 定义

XID(Transaction ID)是 PostgreSQL 内部的事务编号,每个事务都会分配一个XID,依次递增。PostgreSQL 数据中每个元组头部都会保存着 插入 或者 删除 这条元组的XID(Transaction ID),然后内核通过这个 XID 构造数据库的一致性读。在事务隔离级别是 可重复读 的情况下,假设如有两个事务,xid1=200,xid2=201,那么 xid1 中只能看到 t_xmin <= 200 的元组,看不到 t_xmin > 200 的元组。

typedef uint32 TransactionId; /* 事务号定义,32位无符号整数 */
typedef struct HeapTupleFields
{
TransactionId t_xmin; /* 插入该元组的事务号 */
TransactionId t_xmax; /* 删除或锁定该元组的事务号 */

/*** 其它属性省略 ***/
} HeapTupleFields;

struct HeapTupleHeaderData
{
union
{
HeapTupleFields t_heap;
DatumTupleFields t_datum;
} t_choice;

/*** 其它属性省略 ***/
};

展开全部

相关文章

说两句网友评论
    我要跟贴
    取消