在我们的应用程序开发过程中,我们引入了 Azure SQL 地理复制,以改善不同地理位置的用户体验和响应能力。
目前在测试中,我们有两个实例 - 一个主要和次要*,其中一个在美国,另一个在欧洲。
问题
即使调用了 sp_wait_for_database_copy_sync,主数据库中新更新的数据似乎在辅助数据库中也不可用,这应该可以确保这一点。
重现问题的步骤
- 用户连接到辅助实例
- 用户对数据进行更新(进入主数据库的“更新”或“插入”)
- 事务已提交
- 使用适当的参数调用sp_wait_for_database_copy_sync过程,以确保在更新调用解除阻塞时数据已复制到辅助实例中
- 一旦更新调用解除阻塞,就会在辅助数据库上尝试提取数据(包括新更新或插入的数据) 。
- 新更新或插入的数据不包含在结果集中 - 尽管数据库复制同步过程不能确保数据将在更新调用解除阻塞时复制
技术实现细节
当一个实体即将更新、事务提交和数据同步保证时,依次调用以下三行代码:
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()
用于执行调用阻塞同步过程
问题
以上三行代码可能有什么问题?我看到的可能罪魁祸首是:
ISession.Flush
不同步执行,因此在执行阻塞存储过程时,事务尚未实际提交ISession.CreateSQLQuery("EXEC sys.sp_wait_for_database_copy_sync @target_server = N\'secondary-server\', @target_database = N\'database\';").ExecuteUpdate()
实际上并没有被阻止。
任何有关如何解决上述两个问题或您看到的其他问题的想法将不胜感激。
- 在这种情况下,主要和次要与异地复制设置有关。