From a3afd54f9712bf4e4e57aba9a53469f01fd7a914 Mon Sep 17 00:00:00 2001 From: dayjoy Date: Wed, 20 Aug 2025 11:25:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AE=80=E5=8C=96=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knowledge.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/knowledge.md b/knowledge.md index 2f06918..9f87949 100644 --- a/knowledge.md +++ b/knowledge.md @@ -1474,14 +1474,19 @@ Java、SpringBoot、MyBatis-plus(读取)、Hibernate(写入) Service层方法不能返回VO,不能调用Controller层方法(如VoQueryExecutor、VoConverter等) ### 4. TOCO 最佳实践 + #### 4.1 接口参数类型和返回值选择: + 设计TOCO接口(API、RPC)时,先判断主要功能是读库还是写库,分析对应的读写方案及QTO、BTO。读场景**优先**使用QTO作参数;写场景**优先**使用BTO作参数。QTO、BTO不满足时,可增加基本类型、Enum、EO参数。必须遵循:a.DTO、VO不能作参数;b.QTO、BTO不能作返回值。 + **重要说明:** - 本节描述参数选择的**优先级原则**,非绝对限制 - API参数绝对限制见2.14章节 - "优先使用QTO/BTO"指在满足规范前提下,根据场景选择最合适的参数类型 #### 4.2 并发数据保护最佳实践: + 处理先读后更新场景时,为避免并发导致数据脏写,应充分利用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` 校验。 + -----------------------------------------------------------------------------