
【场景】启用新网控仍出现反写覆盖问题

【背景知识】历史版本的反写网控和新版的反写网控实现
[业务流.案例.并发反写的实践和变通方案](https://vip.kingdee.com/article/407587269290352384?productLineId=1)
【新版反写网控】
<1>唯一约束控制
在实现新版网控时,是按照反写规则进行控制(物理表t_bf_networkctrl),通过业务对象+反写规则id+单据内码做唯一约束控制;
<2>无法判断是否同一个操作导致,因此设计为不支持锁重入;
在代码块中,当启用了事务,先调用保存操作,而后调用审核操作时,
审核操作不会再对保存时的反写规则进行网络控制,避免大事务内的操作,审核被保存所冲突;
```csharp
--伪代码,无法判断审核操作与保存有关,当且仅当记录下事务ID时能够跟踪
--但是星空的事务嵌套非常复杂,所以没有这样的设计
using (KDTransactionScope scope = new KDTransactionScope(TransactionScopeOption.RequiresNew))
{
var saveResult = BusinessDataServiceHelper.Save(this.Context, billBusinessInfo, billObjs);
if(saveResult.IsSuccess):
var auditResult = BusinessDataServiceHelper.Audit(this.Context,meta.BusinessInfo,pkArray,auditOption);
scope.Complete();
}
```
【原理】
由于设计的审核操作不会创建保存的反写网控,但实际上审核操作依然会计算保存时的反写,所以还是存在数据并发反写覆盖的原因
【数据准备】生产入库单反写生产订单,标准产品的反写规则(也可以通过Profiler监控)
<1>验证保存操作,会创建新版网控

![image.webp](/download/01000e1cb22bfbcd4124bb3edba9c030eba1.web