1

基于一些周期性并发传入的数据,我正在执行一个操作,该操作会将新行插入表中,或者更新同一个表中的现有行。它是插入还是更新行取决于现有行的状态。因此,此操作的结果将受此操作的先前运行的影响,并影响后续运行。我需要使用事务或锁定或其他方法确保原子性/隔离性。 Entity Framework似乎有很多选择和注意事项(我也是一个全面的数据库资源的新手),我不知道我应该朝哪个方向前进。 TransactionScope,BeginTransaction,环境事务? Serializable或RepeatableRead? SaveChanges和AcceptAllChanges?我甚至需要做特别的事情吗?可以添加新行的事实使我特别担心幻影行,尽管我几乎不明白这意味着什么。任何关于这个问题的指导将不胜感激。实体框架中的并发,原子和隔离

回答

1

本教程可能对你有帮助 - http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

报价:

悲观并发(锁定)

如果您的应用程序确实需要防止 并发场景数据的意外丢失,一种方法是使用数据库锁。 这被称为悲观并发。例如,在从数据库中读取 行之前,您请求锁定为只读或更新 访问。如果您锁定一行以进行更新访问,则不允许其他用户锁定该行以进行只读或更新访问,因为 他们将获得正在更改过程中的数据的副本。 如果您将一行锁定为只读访问权限,其他人也可以将其锁定为 只读访问权限,但不能用于更新。管理锁具有一些缺点。编程可能很复杂。它需要大量的数据库管理资源,并且随着应用程序用户数量的增加(即,其 不能很好地扩展),会导致性能问题 。由于这些原因,并不是所有的数据库管理系统都支持悲观并发。实体框架提供了 没有内置的支持,本教程不会告诉你如何执行它 。

乐观并发

的替代悲观并发是乐观并发。 乐观并发意味着允许发生并发冲突, 然后在适当的情况下做出适当的反应。例如,John运行 “部门编辑”页面,将英文 部门的预算金额从$ 350,000.00更改为$ 100,000.00。 (约翰·管理一个 竞争的部门,要腾出资金用于自己的 部门。)*

有在本教程中这两种模式的代码示例。