0

アプリケーションの開発中に、Azure SQL Geo レプリケーションを導入して、さまざまな地理的な場所でのユーザー エクスペリエンスと応答性を向上させました。

現在、テスト中の 2 つのインスタンスがあります。プライマリとセカンダリ*で、1 つは米国にあり、もう 1 つはヨーロッパにあります。

問題

sp_wait_for_database_copy_sync が呼び出されたにもかかわらず、プライマリデータベースから新しく更新されたデータがセカンダリデータベースで使用できるようには見えません。

問題を再現する手順

  1. ユーザーがセカンダリインスタンスに接続する
  2. ユーザーがデータを更新します (プライマリデータベースに移動する「UPDATE」または「INSERT」 )。
  3. トランザクションがコミットされました
  4. sp_wait_for_database_copy_syncプロシージャは、適切なパラメーターを使用して呼び出され、更新呼び出しのブロックが解除されたときにデータがセカンダリ インスタンスにレプリケートされるようにします
  5. update 呼び出しのブロックが解除されると、データ (新しく更新または挿入されたデータを含む) をプルしようとする試みがセカンダリデータベースで行われます。
  6. 新しく更新または挿入されたデータが結果セットに含まれていない - データベース コピーの同期手順では、更新呼び出しのブロック解除時にデータがレプリケートされることが保証されていませんでしたが、結果セットに表示されます。

技術的な実装の詳細

エンティティが更新され、トランザクションがコミットされ、データの同期が確保されると、次の 3 行のコードが順番に呼び出されます。

  1. ISession.Save(object obj)新しいエンティティを保存するために使用されます
  2. ISession.Flush()トランザクションをコミットするために使用されます
  3. ISession.CreateSQLQuery("EXEC sys.sp_wait_for_database_copy_sync @target_server = N\'secondary-server\', @target_database = N\'database\';").ExecuteUpdate()コールブロッキング同期手順を実行するために使用されます

質問

上記の 3 行のコードのどこが間違っているのでしょうか? 私が見る可能性のある犯人は次のとおりです。

  1. ISession.Flush同期的に実行されないため、ブロッキング ストアド プロシージャが実行されるとき、トランザクションはまだ実際にはコミットされていません。
  2. ISession.CreateSQLQuery("EXEC sys.sp_wait_for_database_copy_sync @target_server = N\'secondary-server\', @target_database = N\'database\';").ExecuteUpdate()実際にはブロックされていません。

上記の 2 つまたはその他の問題をトラブルシューティングする方法についてのアイデアをいただければ幸いです。

  • この場合のプライマリとセカンダリは、geo レプリケーションの設定に関するものです。
4

4 に答える 4