【问题标题】:Azure SQL Geo-Replication with .NET NHibernate sp_wait_for_database_copy_sync issueAzure SQL 异地复制与 .NET NHibernate sp_wait_for_database_copy_sync 问题
【发布时间】:2017-06-22 12:39:00
【问题描述】:

在我们的应用程序开发过程中,我们引入了 Azure SQL 地理复制,以改善不同地理位置的用户体验和响应能力。

目前在测试中,我们有两个实例 - 主要和次要*,其中一个在美国,另一个在欧洲。

问题

即使调用了 sp_wait_for_database_copy_sync,primary 数据库中新更新的数据似乎在 secondary 数据库中不可用,这应该可以确保这一点。

重现问题的步骤

  1. 用户连接到辅助实例
  2. 用户对数据进行更新(进入primary数据库的“UPDATE”或“INSERT”)
  3. 事务已提交
  4. 使用适当的参数调用 sp_wait_for_database_copy_sync 过程,以确保在更新调用解除阻塞时数据已复制到辅助实例中
  5. 一旦更新调用解除阻塞,就会尝试在 辅助 数据库上提取数据(包括新更新或插入的数据)。
  6. 新更新或插入的数据不包含在结果集中 - 尽管数据库复制同步过程无法确保在更新调用解除阻塞时复制数据,但它会出现

技术实现细节

当一个实体即将更新,事务提交和数据同步保证时,依次调用以下三行代码:

  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()用于执行调用阻塞同步过程

问题

以上三行代码有什么问题? 我看到的可能罪魁祸首是:

  1. ISession.Flush 不同步执行,因此当阻塞存储过程执行时,事务还没有真正提交
  2. 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


    【解决方案1】:

    Azure SQL DB 异地复制是为用户数据库设计的,而不是为主数据库设计的。将更新文档以明确这一点。

    【讨论】:

    • 也许使用“主”数据库不是最准确的术语,我的意思是基于地理复制的关系中的主数据库。我已经调整了问题以使其更清楚。
    【解决方案2】:

    这里所说的“主”是指异地复制关系中的主数据库,还是逻辑主数据库?

    【讨论】:

    • 抱歉,我的词汇可能不清楚。我的意思是异地复制关系中的主数据库。我将调整问题以反映这一点。
    【解决方案3】:

    NHibernate 是同步的。 ISession.Flush 始终是同步的。但是,如果您处于分布式TransactionScope(检查System.Transactions.Transaction.Current?.TransactionInformation?.DistributedIdentifier ?? default(Guid) != Guid.Empty)中,则 MSDTC 会启动并导致数据库中的实际提交是异步的,最终发生在作用域处置之后。 Read more here..

    我不确定 Azure 是否接受分布式事务,因此这可能不是您遇到问题的原因。

    如果您处于分布式事务的情况下,那么根据您的查询/数据库设置/...引起的锁,您可以从数据库中读回您提交的数据,依靠事务锁来阻止你直到它被实际提交,然后执行你的同步。或者,如果您没有被锁定,请轮询数据库直到看到您的数据(当然,这对性能来说更糟糕),然后执行同步。

    顺便说一句,我不知道 Azure 异地复制是如何工作的,但如果它也使用 MSDTC,那么它本身可能会出现这些异步问题。

    关于 SQL Exec 实际上没有被阻止,那将是一个 SQL Azure 问题。

    【讨论】:

      【解决方案4】:

      我忘记在这里发帖了,但问题是以下过程虽然阻塞,但实际上并不能保证一旦解除阻塞,数据在所有情况下都可用: sp_wait_for_database_copy_sync。

      【讨论】:

        猜你喜欢
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多