0

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

例如,如果我使用事务,当我从数据库中加载记录时,记录被阻止,因此我可以减去或添加到加载的数量,即我需要的项目数。但是,这块数据库中的记录可能出于性能原因并不是最好的方法。这让我问何时使用 EF 交易。

另一种选择是使用实体框架的并发固定,使用时间跨度列来检测记录是否已更改。在这种情况下,如果在我的加载和更新之间修改了记录,我会遇到并发异常。但是在我的异常处理程序中,如果我用数据库数据更新我的上下文,在我的刷新和 savechanges 之间可能会再次发生变化。

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

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

谢谢。戴姆洛克。

4

1 回答 1

1

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

于 2012-11-07T01:33:08.050 回答