1

次の現象について聞いた、または経験した人はいますか?

Windows で postgresql 9.0.5 を使用する

= テーブル構造 =

[親] - [子] - [孫]

[子] テーブルに奇妙なレコードが残っていることがわかりました。このレコードは、外部キーの制限に違反して存在します。

  • これらのテーブルには、アプリケーションのトランザクション データが格納されます
  • 上記のすべてのテーブルには、数値の PRIMARY KEY があります
  • これらすべてのテーブルには FOREIGN KEY 制限があります (親と子、孫の間)
  • 私のアプリケーションは、トランザクションの進行状況とともに各レコードのステータスを更新します
  • すべてのステータスが「normal_end」に変更されると、アプリはこのレコードをアーカイブ テーブル (同じ構造、同じ制限) にコピーします。
  • 次に、アーカイブ テーブルへのコピーが完了したら、これらのレコードを削除します。

  • [子] テーブルに残っているレコードのステータスは、「正常終了」ではなく「処理中」でした。しかし、アーカイブテーブルにコピーされたデータ (同一 ID) のステータスは "normal_end" でした。

  • pg_log にエラーは報告されていません

なんとも不思議な感覚でした…削除したデータが復活したのではないでしょうか!? 削除されたデータが予期せずアクティブになることはありますか?

4

1 に答える 1

1

外部キー制約に違反するデータがあってはなりません (遅延制約のあるトランザクション中を除く)。

トランザクションがコミットされると、削除された行は削除されたままになります。これは ACID の要件の 1 つです。ただし、PostgreSQL が正しく機能するためには、OS とハードウェアが正しく機能する必要があります。postgresql がファイルを fsync するとき、実際にはディスクまたは不揮発性キャッシュに書き込む必要があります。残念なことに、書き込みが完了していないのにまだ揮発性キャッシュにあるにもかかわらず、ディスクまたはコントローラーがシステムに書き込みが完了したことを通知することがあります。RAID コントローラーに RAM はあるがバッテリーがない場合は、コントローラーのキャッシュがライトスルーに設定されていることを確認してください。

個人的には、PostgreSQL のデータが間違っているのを一度見たことがあります。重複した行 (同じ主キー) がありました。これは、Windows XP マシンでのクラッシュ (おそらく 9.0.x) の後でした。Windows XP マシンは、postgresql を実行する信頼性が高くありません。多くの場合、奇妙なネットワーク エラーが発生します。

于 2012-07-20T05:41:35.257 に答える