Entity framework 实体框架并发:事务还是并发修复?

Entity framework 实体框架并发:事务还是并发修复?,entity-framework,concurrency,transactions,Entity Framework,Concurrency,Transactions,我需要进行库存控制,所以我需要确保当我修改产品数量时,是以正确的方式进行的。我使用的是实体框架4.0 例如,如果我使用一个事务,当我从数据库加载记录时,记录被阻止,因此我可以减去或添加加载的金额,即我需要的项数。但是,这会阻止数据库中的记录,也许出于性能原因,这不是最好的方法。这让我问什么时候使用EF的事务 另一个选项是使用实体框架的并发性固定,使用timespan列来检测记录是否已更改。在这种情况下,如果记录在我的加载和我的更新之间被修改,我会得到并发性异常。但在异常处理程序中,如果使用数据库

我需要进行库存控制,所以我需要确保当我修改产品数量时,是以正确的方式进行的。我使用的是实体框架4.0

例如,如果我使用一个事务,当我从数据库加载记录时,记录被阻止,因此我可以减去或添加加载的金额,即我需要的项数。但是,这会阻止数据库中的记录,也许出于性能原因,这不是最好的方法。这让我问什么时候使用EF的事务

另一个选项是使用实体框架的并发性固定,使用timespan列来检测记录是否已更改。在这种情况下,如果记录在我的加载和我的更新之间被修改,我会得到并发性异常。但在异常处理程序中,如果使用数据库数据更新上下文,刷新和保存更改之间的间隔可能会再次更改

另一个问题是我终于可以保存更改了。例如,我有10个单位,我需要减去8,但在我的加载和更新之间,其他人减去5个单位。如果我减去8,那么库存中我有-3个单位。这是不可能的。如果我有一个事务,我加载记录,被阻止,所以我可以检查我是否有足够的单位,如果有,我可以子跟踪,如果没有,我发送一个异常

所以我的问题是,我知道EF本身就是一个事务,但它也存在于EF中的事务,所以在某些情况下它会很有用。何时使用EF和辅币固定以及何时使用交易

谢谢。
Daimroc.

事务不应用于解决并发问题。您应该使事务尽可能短,以免阻塞数据库。这里的方法是乐观并发——在数据库(SqlServer)中创建一个rowversion列,该列在每次修改行时自动更改。您可以将其用作并发令牌。保存更改时,EF将根据实体上的值进行检查,如果不匹配,则抛出异常。 请注意,对于SaveChanges,EF始终会创建一个事务,因为通常您会保存多个实体,如果出现问题,则需要将数据库恢复到原始状态,否则它将处于损坏状态。 为了防止低于零(如果使用乐观并发),如果数据库中的值发生更改,您将无法保存,因为并发令牌将不同,因为行已修改,因此对客户端的检查应该足够了。或者,您可以将保存实体映射到存储过程,该存储过程将在保存前检查值,如果保存后的值不正确,则会返回错误