entity-framework - 如何在 ORM 中实现一致的事务?
问题描述
我的问题是概念性的。
假设我们使用 ORM(如 Entity Framework、Hibernate 等)并在这些 ORM 中建模我们的领域对象。既然 ORM 会为我们抽象出大部分 SQL / do 事务,我们如何才能确保我们的事务是一致的呢?
示例:我们有一家销售书籍的在线商店。如果我们卖一本书,我们基本上会使用类似这样的东西:
var book = books.Single(b => b.Id == 42);
book.Quantity -= 1;
books.SaveChanges();
但是,如果我正确理解 ORM,它们只会将书籍的更改包装在 UPDATE 查询中。这意味着您可能会遇到这样的基本并发问题: concurrency issue with orms
如果您使用 SQL,您只需将 .Quantity -= 1 包装在事务中并且是安全的。
您通常如何在 ORM 中以适当的方式处理这个问题,或者这是否会以某种方式自动处理?
解决方案
实体框架为此使用乐观并发。并且大多数 RDBMS 系统不会使用事务来防止这种更新异常。
UPDATE T SET Quantity = Quantity - 1 WHERE ID = :ID
这个单一语句将自动运行,虽然使用单一语句可以防止丢失更新,但它不能保证 Quantity 不会降低到零以下。
悲观锁不仅需要事务,还需要锁定提示或提升的事务隔离级别。