【发布时间】:2020-07-26 01:14:09
【问题描述】:
我理解它的方式:您将数据库中的所有数据加载到您的业务逻辑所在的实体中。这就像在当前用例的内存中拥有数据库的副本。
但我看不到如何执行需要数据库 ACID 的逻辑。 例如,如果我们使用银行应用程序的示例。
您如何确保提款不会超过账户余额? 如果客户在两台不同的计算机上登录网站,则在两个会话中都提取有效金额。
他有一点机会可以提取两倍的钱。
这种业务应该如何处理?
【问题讨论】:
-
无论您在前端显示什么,您都应该假设用户可以更改它或者它不会是最新的。对于任何类型的实际交易,您必须在执行之前在后端检查它,然后使用新的数据库状态(银行余额或其他)更新前端。将您的前端简单地视为数据的缓存显示版本,可能是最新的,也可能不是最新的。
-
@joshstrike 忘记前端。想象两个尝试提取资金的 API 端点调用。
-
@adele 当您开始处理每个 api 调用时,您将启动一个数据库事务。然后您可以使用任一悲观锁 - 然后第二个调用将等到第一个调用完成。例如,或乐观锁来验证帐户上预期的最后一个 tx id。这样,您将使用数据库的内置事务保证来确保数据一致性。
-
但由于银行业涉及许多分布式操作,它们(或任何实际业务)很少提供 ACID 保证。因此存在技术透支。但必须确保的是 - 在您的示例中是现金提取的幂等性。
-
没错。在最坏的情况下,第二个将完成,但稍后会回滚,因为您没有足够的资金来真正做到这一点。
标签: entity-framework domain-driven-design ddd-repositories