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