我在使用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相对应的位置,这就是问题所在的位置。我读取超时,因为同步框架似乎锁定了表。 sp_lock2表明Location表上有一个类型为“X”的锁。
踢球者只会在某些表上的某些外键列上发生这种情况。它们中的大多数都很好,但是其中一些每次都会导致独占锁定。
如果有人知道在解决冲突期间具体导致排他锁的原因,或者我可以做些什么来避免它或解决它,我们将不胜感激。如果在解决冲突期间我无法可靠地从数据库中读取数据,那么我的整个冲突处理策略就毫无意义。
更新 看起来我有点不对劲。它不会锁定整个表,只会锁定冲突中涉及的记录。我可以做一个SELECT * FROM位置WHERE ID =(记录的id不参与冲突),我只是不能做SELECT * FROM Location WHERE Id =(冲突记录的id)。
答案 0 :(得分:1)
我不确定原因,但我可以通过在READ UNCOMMITTED事务中执行读取来解决问题。去图。