2012-07-20 56 views
1

有没有人听说过或经历过下列现象?奇怪的数据仍然

在Windows

使用PostgreSQL 9.0.5

=表结构=

[家长] - [儿童] - [孙子]

我发现了一个奇怪的纪录留在[儿童]表。 此记录存在违反外键的限制。

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

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

  • 没有错误报道pg_log

我觉得这很奇怪...... 我怀疑是被删除的数据可能会回来活跃!? 可删除的数据是否有意外激活?

回答

1

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

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

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

+0

非常感谢您的意见。 – user1534289 2012-07-23 03:07:22

+0

如果磁盘或非易失性缓存不稳定,可能会发生这种情况。这个windows2008R2在虚拟机上运行。我不知道也无法想象它可能发生在VM上... – user1534289 2012-07-23 03:14:41