ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

同じ内容が2回表示される現象の原因と対策

辞めた同僚から引き継いだシステムで問い合わせがありました。
「ある番号」を表示する部分が、「20160509001→20160509001」と同じ番号が2回表示されていて、本来は1回だけのはずとのことです。
スクリーンショットも送られてきていたので見てみると、確かに同じ番号が矢印でつないで2回表示されていました。

対象データ確認

調査の手順は、こちらの環境のプログラムと、お客さんの環境で稼働している本番データベースを用いて、現象を確認することから始めます。
結果は、送られてきたスクリーンショットと全く現象を確認できました。

現象を確認すると、対象のデータのidが分かる仕組みになっています。
次は、Oracle SQL Developerを使ってデータベースに登録されている内容を確認します。
製品情報 - Oracle SQL Developer

対象のデータのidを使って絞り込み、データを確認すると、親データのidを格納するカラムに、親データのidが入っています。
親データのidと対象のデータのidを使って再度絞り込み、データを確認すると、「ある番号」を格納するカラムにどちらも「20160509001」が入っていました。
このために現象が発生しているようです。

対象ソースコードを把握

Smartyが使われているソースコードなので、テンプレートから順番にたどって、どこで表示するためのデータを生成しているか確認しました。
データを生成するロジックは、データを確認したときと同じように、まず対象のデータのidを使ってデータを取得し、親データのidが入っていたら再帰して、親データも取得するようになっていました。
「ある番号」は、NULLや空文字列でなければ表示するためのデータとして利用するようになっています。

同じように親データのある他のデータを確認すると、親データの「ある番号」を格納するカラムはNULLになっていて、全てのデータで現象が起きているわけではないことは把握できました。

原因は親データの「ある番号」を格納するカラムに、対象のデータと同じ値が入っているからだとわかりました。
対処として、親データの「ある番号」を格納するカラムをNULLにしてしまえば現象は発生しなくなりますが、どうしてこんなことが起きるのか疑問が残ります。

テスト環境で現象を再現させる

データを表示するページには、データを修正する機能があり、「ある番号」も修正することが可能です。
この機能とデータを登録の順番を試行錯誤することで、同じ「ある番号」が2回表示される現象を再現させました。

再現の手順は、

  1. 「ある番号」を格納するカラムはNULLのままデータを新規に登録する。
  2. 「ある番号」を修正機能を使って登録する。
  3. 2.で登録した「ある番号」を含み、1.のデータを親データとするデータを新規登録する。

でした。

通常1.と3.の処理だけ行われているようです。
1.と3.は別のシステムで作成されたデータをバッチで登録しています。
2.はユーザーが操作する作業で、今回は3.の処理が完了するのが待てなかったのかもしれず、データを更新されたようです。

再現手順を問い合わせ元に報告して、調査は完了しました。