2つの別の場所に存在するテーブルのレコードをプログラムで同期したいと考えています。
それぞれのテーブルは同じ情報を管理していますが、別なフィールドを更新しており、いずれかで更新されたものをもう一方のテーブルに定期的にコピーするという仕組みです。
※レプリケーションなどの方法ではなく、プログラムにより同期を取りたいと考えております。
A、Bそれぞれのテーブルではテーブルの中身は同じですが双方で更新するフィールドはなく、いずれかのフィールドは必ずどちらかのテーブルで更新され、その部分をもう一方のテーブルにコピーするという仕組みです。
主キーはAのテーブルでのみ新規に生成されるAutoIncrementの属性を持つフィールドで管理し、新規のレコードは必ずAのテーブルでのみ生成されます。
最終更新日時のみ同期を取らず、Aの最終更新日時フィールドはAの最終更新日時、Bの最終更新日時フィールドはBの最終更新日時を保持しています。
現在の方法はそれぞれのテーブルで同期処理時点の最終更新日時(DateTime)を保持し、前回の更新以降の日時を持つレコードを最終更新日時フィールドで検索し、該当したレコードの情報をAからBへ、BからAへコピーしています。
SQL
1SELECT * FROM A WHERE update_at > (前回実行時の最終更新日時) AND update_at <= (現在日時);
しかしこの方法ですと、例えば同期処理を行うバッチプログラムが実行された際、1秒以内の同時更新(バッチ処理が16時12分13秒に実行された場合、同じ16時12分13秒に情報が更新されたもの)が漏れてしまうことになると考えています。
仮に更新日時をマイクロ秒まで管理できるようにする(DATETIME(6)とする)場合も、完全に同時処理を制御する事はできないと考えています。
こういった処理を実装する場合、最終更新日時で管理するのは不適切なのでしょうか。
例えば、排他制御(ロック)が行われる事を前提として、更新フラグのようなものを作り、そのフィールドを更新時にはTrueとし、バッチ処理で更新処理後にクリアー(falseを設定)するような方がよいのでしょうか。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/30 09:48
2016/11/30 10:05
2016/11/30 10:16
2016/11/30 12:50
2016/11/30 13:02
2016/12/01 00:57