我有一个asp.net MVC4应用程序,我使用Unity作为我的IoC。我的控制器的构造函数接收一个存储库,该存储库接收一个UnitOfWork(DBContext)。一切似乎工作正常,直到来自同一会话的多个ajax请求发生得太快。由于并发问题,我收到Store update, insert, or delete statement affected an unexpected number of rows (0)
错误。这是从ajax请求调用的方法:
public void CaptureData(string apiKey, Guid sessionKey, FormElement formElement)
{
var trackingData = _trackingService.FindById(sessionKey);
if(trackingData != null)
{
formItem = trackingData.FormElements
.Where(f => f.Name == formElement.Name)
.FirstOrDefault();
if(formItem != null)
{
formItem.Value = formElement.Value;
_formElementRepository.Update(formItem);
}
}
}
这只发生在ajax请求快速发生时,意味着快速。当请求以正常速度发生时,一切似乎都很好。这就像应用程序需要时间来赶上。不知道我需要如何处理我的存储库中的并发检查,所以我不会错过更新。此外,我尝试将“MultipleActiveResultSets”设置为true,但没有帮助。
答案 0 :(得分:1)
正如您在评论中提到的,您正在使用行版本列。本专栏的目的是防止同一行的并发覆盖。您有两个操作:
现在,如果这些操作是由并发请求执行的,您可能会收到:
异常被告知您正在尝试更新过时数据,因为已经有更新记录的新版本。通常,您需要刷新数据(通过从数据库重新加载当前记录)并尝试再次保存它们。在高度并发的情况下,此处理可能会重复多次,因为只是您的数据库旨在防止这种情况。您的选择是: