【问题标题】:Sync Framework - Update/Update conflict in FK column causes locks in FK table同步框架 - FK 列中的更新/更新冲突导致 FK 表中的锁定
【发布时间】:2011-06-07 18:29:44
【问题描述】:

我在使用 Sync Framework 进行自定义冲突处理时遇到了一个非常奇怪的问题。考虑以下简单的数据库结构:

CREATE TABLE [dbo].[Container](
    [Id] [uniqueidentifier] NOT NULL DEFAULT newid(),
    [LocationId] [uniqueidentifier] NULL REFERENCES [dbo].[Location],
    .....
)

CREATE TABLE [dbo].[Location](
    [Id] [uniqueidentifier] NOT NULL DEFAULT newid(),
    [Name] [varchar](100) NULL,
    .....
)

现在假设我的数据库中有一个容器。在客户端上,我将其 LocationId 设置为一个值。在服务器上,我将其设置为其他值。我尝试同步,如预期的那样,我收到了类型为 LocalUpdateRemoteUpdate 的 ApplyChangeFailedEvent。

作为我解决冲突过程的一部分,我想向用户显示有关冲突的信息,并让他们选择正确的位置。为此,我需要在客户端和服务器端读取LocationId对应的Location,这就是问题所在。我的读取超时,因为同步框架似乎已经锁定了表。 sp_lock2 表明 Location 表上有一个类型为“X”的锁。

问题在于,这只发生在 some 表上的 some 外键列上。大部分都很好,但有些每次都会导致排他锁。

如果有人对在解决冲突期间导致排他锁的具体原因有任何想法,或者我可以做些什么来避免它或解决它,我们将不胜感激。如果在冲突解决期间我不能可靠地从数据库中读取数据,那么我的整个冲突处理策略几乎毫无意义。

更新: 看来我有点错了。它不会锁定整个表,只锁定冲突中涉及的记录。我可以执行 SELECT * FROM Location WHERE ID =(不涉及冲突的记录 ID),但我不能执行 SELECT * FROM Location WHERE Id =(冲突记录 ID)。

【问题讨论】:

  • 您要同步很多行吗?会不会是您正在更新许多行,而 Sql Server 决定将其升级为表级锁? afaik,Sync Fx 确实注意到明确发出锁并依赖 Sql Server 来做到这一点。
  • 感谢您的回复。这似乎是合理的,尽管在这种情况下它甚至发生在单行中。
  • 您是否在与容器相同的范围内同步位置?您在哪个表中遇到冲突?同步范围内是否有其他表引用 Location 表?

标签: database locking sync microsoft-sync-framework


【解决方案1】:

我不确定为什么,但我可以通过在 READ UNCOMMITTED 事务中执行读取来解决此问题。去图吧。

【讨论】:

  • 您可以阅读它,因为您明确忽略了该行的事务状态。如果该行刚刚更新但尚未提交,则您正在读取未提交的值。根据您正在执行的操作,这可能会导致您在其他地方使用未提交的值并且原始事务回滚的问题。
  • 谢谢!这正是我所需要的。我只是想阅读本地关系行以向用户显示差异。我花了几个小时才找到这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多