更新 knowledge.md

This commit is contained in:
oyo
2025-10-22 17:21:58 +08:00
parent 8ecdfbab6e
commit 3699f4833c

View File

@@ -1704,5 +1704,62 @@ TOCO严格遵照分层规则必须严格遵守否则会产生严重后果
处理先读后更新场景时为避免并发导致数据脏写应充分利用BoService校验功能。例如账户扣钱场景避免并发扣除导致余额不足传统raw sql用 `update account set balance = balance - amount where user_id = xxx and balance > amount` 的where条件保护在TOCO中应该1、写方案中使用incr字段。2、在boService中添加保护代码 `if(userBo.getBalance() >= 0)` 或通过userBo业务不变性聚合校验添加 `balance>=0` 校验。 处理先读后更新场景时为避免并发导致数据脏写应充分利用BoService校验功能。例如账户扣钱场景避免并发扣除导致余额不足传统raw sql用 `update account set balance = balance - amount where user_id = xxx and balance > amount` 的where条件保护在TOCO中应该1、写方案中使用incr字段。2、在boService中添加保护代码 `if(userBo.getBalance() >= 0)` 或通过userBo业务不变性聚合校验添加 `balance>=0` 校验。
#### 4.3 聚合校验识别与实现指南
##### 1. 业务不变性规则的明确判断标准
**必须放在聚合校验中的场景(四个核心判断标准):**
**标准1聚合内实体间的约束关系**
- 父子实体之间的数据一致性约束
- 示例:订单总金额 = 所有订单项金额之和
- 示例:会议时间范围必须包含所有议程时间
- 示例:主实体状态变更影响子实体状态的规则
**标准2聚合内集合类型字段的内部约束**
- 列表元素之间的互斥、重叠、顺序等约束
- 示例:同一会议的议程时间不能重叠
- 示例:同一用户的多个手机号不能重复
- 示例:优先级序号必须连续且唯一
**标准3聚合根实体自身的完整性约束**
- 单个实体内多个字段之间的逻辑关系
- 示例:开始时间 < 结束时间
- 示例折扣价 原价
- 示例最小值 最大值
**标准4领域概念的强制性规则**
- 体现核心业务概念的必然约束
- 示例会议必须至少有一个议程
- 示例订单必须至少有一个订单项
- 示例员工必须属于某个部门
**不应放在聚合校验中的场景:**
**场景1需要外部数据查询的校验**
- 需要查询数据库其他表的数据
- 需要调用其他服务的RPC
- 示例会议室占用校验需要查询其他会议
- 示例用户名唯一性校验需要查询用户表
- **实现位置**Controller或Service层
**场景2用例特定的前置条件校验**
- 仅在特定API或业务流程中需要的校验
- 非领域模型核心规则
- 示例必填参数校验
- 示例参数格式校验
- **实现位置**Controller层
**场景3需要重型操作的校验**
- 需要复杂计算或外部服务调用
- 会严重影响性能的校验
- **实现位置**Service层
##### 2. 实现注意事项
- 聚合校验方法会在写方案执行数据库操作前自动调用
- 禁止在业务代码中显式调用validateAggregate()或valid()方法
- 如果校验逻辑需要查询数据库或调用RPC不要放在聚合校验中
- 聚合校验应该是纯内存操作执行速度快
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
</TOCO知识库> </TOCO知识库>