【发布时间】:2017-06-22 12:39:00
【问题描述】:
在我们的应用程序开发过程中,我们引入了 Azure SQL 地理复制,以改善不同地理位置的用户体验和响应能力。
目前在测试中,我们有两个实例 - 主要和次要*,其中一个在美国,另一个在欧洲。
问题
即使调用了 sp_wait_for_database_copy_sync,primary 数据库中新更新的数据似乎在 secondary 数据库中不可用,这应该可以确保这一点。
重现问题的步骤
- 用户连接到辅助实例
- 用户对数据进行更新(进入primary数据库的“UPDATE”或“INSERT”)
- 事务已提交
- 使用适当的参数调用 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()实际上并没有被阻止。
对于如何解决上述两个问题或您看到的其他一些问题的任何想法将不胜感激。
- 在这种情况下,主要和次要与异地复制设置有关。
【问题讨论】:
标签: .net azure nhibernate azure-sql-database geo-replication