我是并发管理的新手,如果对此问题不了解,请您道歉。

在过去的项目中,我通过将操作包装在TransactionScope中来实现并发检查-像这样:

using (var scope = new TransactionScope(TransactionScopeOption.Required, options))
{
    var copiedFolder = new Folder();
    using (var db = CreateContext())
    {
        // do stuff safely
    }
    scope.Complete();
    return copiedFolder;
}


但是,我刚刚遇到了Entity Framework的并发方法:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

我想知道什么时候使用另一种更好。从技术上讲,它们是同一回事吗?如果没有,它们有何不同?

最佳答案

它们不是同一件事。并发作为一种机制可以确保当两个用户同时访问同一实体时不进行覆盖。

我举一个例子。想象一下ID为541且名称设置为“ Alex”的行。

假设您有两个用户,用户A和用户B,都试图修改该行的名称。以下是并发的全部含义:


用户A从数据库中读取实体。
用户B从数据库中读取实体。
用户A将Name的值修改为“ Alexander”,并将更改提交给
数据库。
用户B将Name的值修改为“ Alexander B”,并将更改提交给
数据库。


用户A所做的更改将在用户B不知道的情况下被覆盖。

并发性基本上是在确保读取的用户B和用户B的更改提交之间的值发生更改时,它将抛出DbConcurrencyException,指示实体已更改,从而使用户B可以取消保存或继续进行操作。

如果要确保特定属性免于不可见的覆盖,请使用[ConcurrencyCheck]对其进行标记。默认情况下,实体框架通过在WHERE子句中提供Id(身份)列来进行更新。当另一列标记有[ConcurrencyCheck]时,它还将向UPDATE命令添加附加条件,该条件在本示例中基本上为WHERE NAME ='Alex'。因此,由于Alex在数据库中不再是值(用户A已对其进行更改),它将进行0次更新,这将在内部导致异常。

关于c# - Entity Framework 的ConcurrencyCheck和标准TransactionScopes之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18814944/

10-13 04:59