Dynamics CRM:CreateRequest 并发问题

Dynamics CRM: CreateRequest concurrency issue

我正在使用带有 C# 的 MS Dynamics CRM SDK。在这里,我有一个创建实体记录的 WCF 服务方法。 我在方法中使用 CreateRequest 。客户端立即用 2 个相同的请求一个接一个地调用此方法。

创建记录前有一个提取。如果记录可用,我们将对其进行更新。但是,有 2 个插入是在同一时间发生的。 因此在 CRM 中创建了 2 条具有相同数据的记录。

谁能帮忙防止并发?

正如 Filburt 在您的问题中所评论的那样,首选方法是使用 Alternate Key and Upsert requests 但不幸的是,如果您使用的是 CRM 2013,那不适合您。

在您的方案中,我将在 WCF 服务中实现一个非常轻量级的缓存,可能使用 System.Runtime.Caching.dll 库 (small example) 中的 MemoryCache 对象。在对 CRM 执行查询之前,您可以检查记录是否存在于缓存中,如果不存在则继续当前处理(记住将记录添加到缓存中,并为潜在的并发执行设置一个小的过期时间)或处理记录已存在于缓存中的场景(在这里您可以从进行相当复杂的检查以检测和防止潜在数据 loss/unnecessary 更新到简单而愚蠢的 Thread.Sleep(1000))。

您应该强制执行重复检测规则并决定要做什么。 Read more

Account a = new Account();
a.Name = "My account";

CreateRequest req = new CreateRequest();
req.Parameters.Add("SuppressDuplicateDetection", false);
req.Target = a;
try
{
    service.Execute(req);
}
catch (FaultException<OrganizationServiceFault> ex)
{
    if (ex.Detail.ErrorCode == -2147220685)
    {
        // Account with name "My account" already exists
    }
    else
    {
        throw;
    }
}