我需要进行库存控制,所以我需要确保当我修改产品的数量时,是以正确的方式进行的。我正在使用Entity Framework4.0
例如,如果我使用一个事务,当我从数据库加载记录时,记录会被阻塞,因此我可以减去或增加加载的金额,即我需要的项目数。但是,这会阻塞数据库中的记录,可能是出于性能原因,这不是最好的方法。这让我不禁要问,什么时候将事务与EF一起使用。
另一种选择是使用实体框架的并发固定,使用timespan列来检测记录是否已更改。在这种情况下,如果记录在我的加载和更新之间被修改,我会得到并发异常。但在我的异常处理程序中,如果我用数据库数据更新我的上下文,我的刷新和保存更改之间可能会再次更改。
另一个问题是我终于可以保存更改了。例如,我有10个单位,我需要减去8,但在我的负载和更新之间,其他人减去5个单位。如果我减去8,那么库存就是-3个单位。这是不可能的。如果我有一个事务,我加载被阻塞的记录,所以我可以检查我是否有足够的单元,如果有,我可以子跟踪,如果没有,我发送一个异常。
所以我的问题是,我知道EF本身是一个事务,但它在EF中也存在事务,所以它在某些情况下会很有用。何时使用EF和共同货币固定,何时使用事务?
谢谢。戴姆洛克。
发布于 2012-11-07 09:33:08
事务不应用于解决并发问题。您应该使事务尽可能短,以免阻塞您的数据库。这里的方法是乐观并发-在数据库(SqlServer)中创建一个rowversion列,该列在每次修改一行时自动更改。您可以将其用作并发令牌。在保存更改时,EF会根据实体上的值进行检查,如果它们不匹配,就会抛出异常。请注意,对于SaveChanges,EF总是创建一个事务,因为通常您会保存多个实体,如果出现问题,数据库需要恢复到原始状态-否则它将处于损坏状态。为了防止低于零-如果您使用开放式并发-您将无法保存数据库中的值,因为并发令牌将不同,因为行被修改,因此客户端上的检查应该足够了。或者,您可以将保存实体映射到一个存储过程,该存储过程将在保存之前检查该值,如果保存后的值不正确,则会返回一个错误。
https://stackoverflow.com/questions/13247560
复制相似问题