执行 PostgreSQL 中的 DDL 后元数据未刷新 交易

作者: FlyingZC创建于 2025年4月11日更新于 2026年9月17日
标签type: bugfeature: transactiondb: PostgreSQL

□ 错误报告 在去除PostgreSQL在ShardingSphere(''org.apache.shardingspere.proxy.backend.connector.ProxySQLExecutor#checkExecutePrerequisites')中执行DDL的限制后,观察到了以下问题:

当修改元数据的 DDL 语句(如 ALTER t1 ACD COLUMN c1 INT)在交易中执行时,刷新元数据操作使用新的物理连接. 由于交易尚未承诺,DDL的元数据变化不明显,导致刷新元数据失败(如未检测出新列).

你用的是哪个版本的ShardingSphere? 师曰.

你用的是哪个项目? 硬盘-JDBC还是硬盘-Proxy? 硬圈- Proxy

预期行为 在PostgreSQL交易中执行DDL后,ShardingSphere中的元数据信息应当与PostgreSQL上的表格结构一致.

实际行为 DDL在交易中执行成功,但相应的元数据在ShardingSphere上没有被成功刷新.

理由分析(如果可以) 跟踪 PostgreSQL 交易中涉及元数据变化 DDL 操作的所有表格名称 。 延迟元数据在交易完成前刷新,然后对受影响的表格进行统一的元数据刷新。

QQ 复制行为的步骤, 如: SQL 要执行, 硬化规则配置, 当例外发生时等.

  1. 开始PostgreSQL交易。
  2. 在交易中执行 DDL 语句(例如,替代表t1 ADD COLUMN c1 INT)。
  3. 在进行交易后,再次查询元数据,并观察到新栏未刷新. 预期行为 元数据应在交易承诺后自动刷新,以确保更改(如新列)生效.

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

  • PostgreSQL试验方案

  • 开始; 比利时

  • 在交易中执行DDL。

  • ShardingSphere元数据刷新使用新连接,因此无法看到未承诺的计划变化 sharding db=> 更改表 t 顺序后添加一栏 t1英寸; 备选表格 执行; 承诺

-- t1栏未自动刷新 从 t 顺序中选择 *; 命令 id 用户 id 状态 创建 日期 QQ ------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------- (行数为0)

-- 加载t1列所需的手动元数据刷新 正在刷新表格元数据 t 顺序; 失败 从 t 顺序中选择 *; 命令 id 用户 id QQ状态 创建 日期 t1 QQ -------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------- (行数为0)


· 复制这个问题的实例代码(例如GitHub链接).

内容来源: apache/shardingsphere