聚合是否应该涉及数据库中的读锁?
Should aggregate involve a read-lock in database?
我读了 Eric Evan 关于 DDD 的书,第 聚合 一章。
在处理Order/OrderLine例子时,说明:
When both users have saved their changes, an Order will be stored in the
database that violates the invariant of the domain model. An important
business rule has been broken. And nobody even knows. Clearly, locking
a single line-item isn’t an adequate safeguard. If, instead, we locked
an entire Order at a time, the problem would have been prevented.
我很清楚聚合的本质是通过单个包装的数据库事务来保护不变量。
但是,是否应该在数据库端为每个聚合指定读锁,以防止在多个用户同时修改此聚合时出现潜在的并发问题(竞争条件)?
聚合的真正意义是收集一些元素用于数据库端的读锁吗?
任何对此的澄清都会让我很高兴。
I well know that the essence of Aggregate is to protect invariants
with a single wrapped database transaction.
是吗?聚合根作为其自身不变量周围的一致性边界存在。鉴于持久性发生在一个完全不同的进程中的整个网络中,进程中的聚合如何希望保证围绕超出其控制范围的事物的一致性?
DDD 的本质是领域和基础设施问题的分离;聚合应该根据域建模(订单、产品、客户)来表达,其他所有内容(数据库、持久性、锁定、事务)都是基础结构 并且不应污染您的领域模型。
不是,两者是正交的:
聚合设计的目标是建立一致性边界并保护边界内的不变量。锁定设计的目标是在应用程序中实现适当级别的并发。
这意味着对于相同的聚合设计,不同的锁定机制可能有意义(取决于应用程序的非功能性要求)。
我读了 Eric Evan 关于 DDD 的书,第 聚合 一章。
在处理Order/OrderLine例子时,说明:
When both users have saved their changes, an Order will be stored in the database that violates the invariant of the domain model. An important business rule has been broken. And nobody even knows. Clearly, locking a single line-item isn’t an adequate safeguard. If, instead, we locked an entire Order at a time, the problem would have been prevented.
我很清楚聚合的本质是通过单个包装的数据库事务来保护不变量。
但是,是否应该在数据库端为每个聚合指定读锁,以防止在多个用户同时修改此聚合时出现潜在的并发问题(竞争条件)?
聚合的真正意义是收集一些元素用于数据库端的读锁吗?
任何对此的澄清都会让我很高兴。
I well know that the essence of Aggregate is to protect invariants with a single wrapped database transaction.
是吗?聚合根作为其自身不变量周围的一致性边界存在。鉴于持久性发生在一个完全不同的进程中的整个网络中,进程中的聚合如何希望保证围绕超出其控制范围的事物的一致性?
DDD 的本质是领域和基础设施问题的分离;聚合应该根据域建模(订单、产品、客户)来表达,其他所有内容(数据库、持久性、锁定、事务)都是基础结构 并且不应污染您的领域模型。
不是,两者是正交的:
聚合设计的目标是建立一致性边界并保护边界内的不变量。锁定设计的目标是在应用程序中实现适当级别的并发。
这意味着对于相同的聚合设计,不同的锁定机制可能有意义(取决于应用程序的非功能性要求)。