ACID で使用される意味での一貫性とは、変更の前後ですべての制約が満たされることを意味します。システムが一貫性のないデータを読み取れないことを保証する場合、たとえば、子行が存在しない親行を参照しているデータや、トランザクションの半分が適用されているが、残りの半分はまだ適用されていません (教科書の例では、1 つの銀行口座から引き落とされていますが、受取人の銀行口座にはまだ入金されていません)。
MySQL のレプリケーションは、デフォルトでは非同期、またはせいぜい「半同期」です。確かに、どちらの場合でも遅れます。実際、マスターはトランザクションがコミットされるまでバイナリ ログに変更を書き込まないため、レプリケーション レプリカは常に少なくとも数分の 1 遅れています。その後、レプリカはバイナリ ログをダウンロードしてイベントをリレーする必要があります。
しかし、変更はまだアトミックです。部分的に変更されたデータを読み取ることはできません。コミットされた変更を読み取る (すべての制約が満たされている場合) か、変更がまだコミットされていない場合 (トランザクションが開始される前のデータの状態が表示される場合) のいずれかです。
そのため、遅延のあるレプリケーション システムで一時的に古いデータを読み取ることはできますが、一貫性のないデータを読み取ることはありません。
一方、「結果整合性」システムでは、部分的に更新されたデータを読み取る可能性があります。この場合、1 つのアカウントは引き落とされ、2 番目のアカウントはまだ入金されていません。したがって、矛盾したデータを見ることができます。
アプリケーションが完全に最新のデータを必要とする場合は、レプリカからの読み取りに注意する必要があるかもしれません。アプリケーションごとにレプリケーション ラグの許容範囲が異なります。実際、1 つのアプリケーション内でもクエリごとにラグの許容範囲が異なります。これについてプレゼンテーションを行いました: MySQL と PHP の読み取り/書き込み分割(Percona webinar 2013)