基于一些定期和同时传入的数据,我正在执行一项操作,该操作将向表中插入新行,或更新同一表中的现有行。是否插入或更新行取决于现有行的状态。因此,该操作的结果将受到该操作之前运行的影响,并影响后续运行。我需要使用事务、锁或其他东西来确保原子性/隔离性。Entity Framework 似乎有很多选择和注意事项(而且我一般也是数据库方面的新手),我不知道我应该朝哪个方向发展。TransactionScope、BeginTransaction、环境交易?可序列化或可重复读取?SaveChanges 和 AcceptAllChanges?我什至需要做一些特别的事情吗?可以添加新行的事实让我特别担心幻影行,尽管我几乎不明白这意味着什么。任何有关该主题的指导将不胜感激。
问问题
717 次
1 回答
1
引用:
悲观并发(锁定)
如果您的应用程序确实需要防止并发场景中的意外数据丢失,那么一种方法是使用数据库锁。这称为悲观并发。例如,在从数据库中读取一行之前,您请求锁定以进行只读或更新访问。如果您锁定一行以进行更新访问,则不允许其他用户锁定该行以进行只读或更新访问,因为他们将获得一份正在更改的数据副本。如果您锁定一行以进行只读访问,其他人也可以将其锁定为只读访问,但不能锁定更新。管理锁有一些缺点。编程可能很复杂。它需要大量的数据库管理资源,并且随着应用程序用户数量的增加(也就是说,它不能很好地扩展),它可能会导致性能问题。由于这些原因,并非所有数据库管理系统都支持悲观并发。Entity Framework 没有为它提供内置支持,本教程也不会向您展示如何实现它。
乐观并发
悲观并发的替代方案是乐观并发。乐观并发意味着允许并发冲突发生,然后在发生时做出适当的反应。例如,John 运行部门编辑页面,将英语部门的预算金额从 $350,000.00 更改为 $100,000.00。(约翰管理一个竞争部门,并希望为自己的部门腾出资金。)*
教程中的两个模型都有代码示例。
于 2013-01-14T03:08:35.460 回答