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;
}
}
我正在使用带有 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;
}
}