在练习DDD时,一个好的技术模式是在同一个数据库事务中存储与创建/更新的模型相关的事件。
一个简单的例子,我们假设一个Meeting
实体和一个允许创建Meeting
的功能。
它应该生成一个CreatedMeetingEvent
,我存储在我的数据库中,在我的案例中是Neo4j。
为了从Neo4j的图形性质中受益,我选择存储这样的事件:
(createdEvent)-[:CREATED]->(meeting)
(createdEvent
将包含一些"元数据"如occurredOn
时间戳等。
请注意,neo4j采用锁定事务,其规则为:
创建或删除关系时,将执行写锁定 具体关系及其两个节点。
因此,我无法在同一交易中插入新创建的meeting
节点和相应的事件。
=> pessimistic locking
我不想将这笔交易分成两部分? 实际上,基本上,如果事件保存在不同的交易中,可能会发生潜在的不一致。
如何处理此案?
隔离图中的事件,保持与meetingId
属性的模型的逻辑链接?
会......浪费..