アプリケーションの開発中に、Azure SQL Geo レプリケーションを導入して、さまざまな地理的な場所でのユーザー エクスペリエンスと応答性を向上させました。
現在、テスト中の 2 つのインスタンスがあります。プライマリとセカンダリ*で、1 つは米国にあり、もう 1 つはヨーロッパにあります。
問題
sp_wait_for_database_copy_sync が呼び出されたにもかかわらず、プライマリデータベースから新しく更新されたデータがセカンダリデータベースで使用できるようには見えません。
問題を再現する手順
- ユーザーがセカンダリインスタンスに接続する
- ユーザーがデータを更新します (プライマリデータベースに移動する「UPDATE」または「INSERT」 )。
- トランザクションがコミットされました
- sp_wait_for_database_copy_syncプロシージャは、適切なパラメーターを使用して呼び出され、更新呼び出しのブロックが解除されたときにデータがセカンダリ インスタンスにレプリケートされるようにします。
- update 呼び出しのブロックが解除されると、データ (新しく更新または挿入されたデータを含む) をプルしようとする試みがセカンダリデータベースで行われます。
- 新しく更新または挿入されたデータが結果セットに含まれていない - データベース コピーの同期手順では、更新呼び出しのブロック解除時にデータがレプリケートされることが保証されていませんでしたが、結果セットに表示されます。
技術的な実装の詳細
エンティティが更新され、トランザクションがコミットされ、データの同期が確保されると、次の 3 行のコードが順番に呼び出されます。
ISession.Save(object obj)
新しいエンティティを保存するために使用されますISession.Flush()
トランザクションをコミットするために使用されますISession.CreateSQLQuery("EXEC sys.sp_wait_for_database_copy_sync @target_server = N\'secondary-server\', @target_database = N\'database\';").ExecuteUpdate()
コールブロッキング同期手順を実行するために使用されます
質問
上記の 3 行のコードのどこが間違っているのでしょうか? 私が見る可能性のある犯人は次のとおりです。
ISession.Flush
同期的に実行されないため、ブロッキング ストアド プロシージャが実行されるとき、トランザクションはまだ実際にはコミットされていません。ISession.CreateSQLQuery("EXEC sys.sp_wait_for_database_copy_sync @target_server = N\'secondary-server\', @target_database = N\'database\';").ExecuteUpdate()
実際にはブロックされていません。
上記の 2 つまたはその他の問題をトラブルシューティングする方法についてのアイデアをいただければ幸いです。
- この場合のプライマリとセカンダリは、geo レプリケーションの設定に関するものです。