2


1

私はデータベース(mysql)内のどの行がサーバーからそれらを取得し、アプリケーション(クライアント)にローカルに格納するために新しい(または更新された)かを知る方法を探しています。

私の最初の考えは、各行にタイムスタンプを追加し、私のアプリケーションにそれが最後に更新された時刻を記憶させることでした、しかし私はサーバーの時計が逆に変わるのを心配しています。 夏時間から冬時間に移行する場合、またはトランザクションがサーバー上で進行している間にクライアントが更新する場合。http://www.pervasync.com/faq#TOC-Q.-What-s-wrong-with-those-time- sta [ - > example]

タイムスタンプ(非常に明白で明らかに一般的な考え)以外に、この種のことに推奨されるベストプラクティスはありますか?

5 Answer


2


その他のアイデア:

  • 挿入できるデータの場合は、IDが大きくなります(例: シーケンスや類似の概念によって生成された)で十分です

  • これは、挿入または更新されるたびにシーケンスから更新される(トリガーによって設定される)各テーブルの列によって拡張できます

  • 各テーブルの列ではなく、類似した情報を収集する中央ログテーブルがある方が簡単な場合があります(複合キーがある場合は関連する行を識別するのが難しい)。

あなたがそのような計画に取り組むべき正当な理由がない限り、私は非常に慎重になるでしょう。 この種の同期は、解決するのが難しいように思われる多くのトリッキーな問題に遭遇するかもしれません。


1


タイムスタンプの代わりに、テーブルにオートインクリメントカラムを置き、そのカラムの現在最大の値を格納します。 更新する必要がある場合は、auto_column> my_largest_valueを選択してください。


0


多くのデータベースは並行性チェックにタイムスタンプを使用しているので、それが自然な(そして正しいIMOの)方法です。 特に同時実行性チェックに使用されているタイムスタンプフィールドが既にある場合。

DSTの変更中は、クライアントのレコードキャッシュを無効にして、時間変更後にすべてのレコードをリロードする方法が必要です。

あるいは、Danielが指摘したように、タイムスタンプにUTCを使用するだけで、タイムゾーンの変更を心配する必要はまったくありません。


0


http://dev.mysql.com/doc/refman/5.0/en/timestamp.html[Timestamp]列タイプを見てください。レコードを作成または変更するたびに自動的に更新されます。

タイムゾーンは、クエリ方法によっては問題にならないはずです。 夏時間のないUTCとして値を格納します。


0


MySQLにはネイティブのChange Data Captureがないため、INSERT、UPDATE、DELETEの各トリガーを実装して、必要なものを監査テーブルに取り込み、そこからデータを取得することができます。 貧乏人の複製技術の一種。