首页 > 解决方案 > 如何在 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 中以适当的方式处理这个问题,或者这是否会以某种方式自动处理?

标签: entity-frameworkormtransactionsconsistencyacid

解决方案


实体框架为此使用乐观并发。并且大多数 RDBMS 系统不会使用事务来防止这种更新异常。

UPDATE T SET Quantity = Quantity - 1 WHERE ID = :ID

这个单一语句将自动运行,虽然使用单一语句可以防止丢失更新,但它不能保证 Quantity 不会降低到零以下。

悲观锁不仅需要事务,还需要锁定提示或提升的事务隔离级别。


推荐阅读