1

有没有人听说过或经历过以下现象?

在 Windows 上使用 postgresql 9.0.5

= 表结构 =

[父母] - [孩子] - [孙子女]

我发现 [child] 表上奇怪地保留了一条记录。该记录存在违反外键的限制。

  • 这些表存储我的应用程序的事务数据
  • 以上所有表格都有数字 PRIMARY KEY
  • 所有这些表都有 FOREIGN KEY 限制(在父子、孙子之间)
  • 我的应用程序随着交易进度更新每条记录状态
  • 一旦所有状态更改为“normal_end”,我的应用程序就会将此记录复制到存档表(相同的结构,相同的限制)。
  • 然后,在完成将它们复制到存档表时删除这些记录。

  • [child] 表上剩余记录的状态不是“normal_end”而是“processing”。但存档表中复制数据(相同 ID)的状态为“normal_end”。

  • pg_log 没有报告错误

我觉得很奇怪......我怀疑删除的数据可能会恢复活动!?删除的数据是否会意外激活?

4

1 回答 1

1

永远不应该有违反外键约束的数据(在具有延迟约束的事务期间除外)。

提交事务后,已删除的行应保持删除状态。这是 ACID 的要求之一。然而,PostgreSQL 的正确工作依赖于您的操作系统和硬件的正确运行。当 postgresql fsyncs 文件时,它应该真正写入磁盘或非易失性缓存。不幸的是,有时磁盘或控制器会告诉系统写入已经完成,而它还没有完成并且仍在易失性缓存中。如果您有一个带 RAM 但没有电池的 RAID 控制器,请确保控制器缓存设置为直写。

就我个人而言,我曾经见过 PostgreSQL 有一次不正确的数据,它有一个重复的行(相同的主键),这是在 windows xp 机器上崩溃之后(这很可能是 9.0.x)。Windows XP 机器运行 postgresql 不是很可靠。他们经常给出奇怪的网络错误。

于 2012-07-20T05:41:35.257 回答