奇怪的数据依旧

时间:2012-07-20 02:07:38

标签: postgresql

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

在Windows上使用postgresql 9.0.5

= table structure =

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

我在[儿童]牌桌上发现了一条奇怪的记录。 该记录存在违反外键限制的情况。

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

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

  • pg_log
  • 未报告任何错误

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

1 个答案:

答案 0 :(得分:1)

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

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

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