凭证生成状态反写问题排查分析
一、分布式事务问题
1. 问题描述
很多业务单据生成凭证之后单据需要回写是否生成凭证的标识,但是很多情况下单据和凭证表不在同一个事务,无法通过数据库的事务保证数据的一致性,因此通过引入平台的分布式事务一致性框架保证生成凭证单据反写和凭证数据的一致性。但是这个框架的引入衍生出常见的问题:凭证提交时候报“还在分布式事务中,不能提交”或者凭证生成或者删除后业务单据没有及时反写。
2. 解决方法
可能原因分析:
1)反写逻辑执行确实很慢,还没结束
2)反写逻辑执行异常,分布式事务后台正在重试,或者多次重试失败转人工处理
3)程序bug引起的
排查方法
1)首先通过单据的业务ID反查应对的分布式事务记录
2)在事务查询中查询分布式事务状态
3)如果状态是“分支事务执行中”,说明反写逻辑还没处理结束,需要排查为什么会执行这么久(数据库负载太高?节点压力太大?)
4)如果状态是“提交失败”,说明执行反写是有异常,点击“查看日志”,排查具体原因
5)其他问题需要开发介入一起排查,解决方法:
5.1 找到系统中配置工具——>分布式事务——>事务补偿这个菜单,事务场景选择财务生成凭证或者财务删除凭证(根据业务操作来选择),重试/回滚结果选处理失败,看有没有异常数据,有的话,选中异常数据点击重试。
5.2 若能够提交成功,则凭证能够正常提交,业务单据凭证生成标识能够正常反写。如果提交失败可能是代码本身有问题,这种情况就需要开发介入。点重试之前,按F12打开开发者工具。
5.3 然后点击重试拿到这次请求的traceId,根据traceId找到相应的monitor日志进行分析。
二、反写配置及日志排查方法
查看DAP配置表(ai_dapconfig),列表预览之后,通过单据标识去查数据,看是否已经配置了反写插件。
查询到业务单据的id,用单据id作为关键字去monitor中搜索日志,先搜到生成凭证的traceid,然后用traceid去看生成凭证的整个流程,如果最后写生成凭证耗时XX秒代表生成凭证的流程无问题
查询到业务单据的id,用单据id作为关键字去monitor中搜索日志,搜writeback字样对应的traceid,然后用traceid去看反写的整个流程。
其他原因:
4.1 部分单据在单据的删除凭证操作增加了前端逻辑,但用户可能直接从总账凭证列表删除凭证,造成逻辑不一致;
4.2 二开增加了反写配置,注册了多个反写插件,目前产品不能支持多插件,可采取继承方式增加业务逻辑;
4.3 总账凭证调整编码后,目前不会调用反写,会造成单据上反写的凭证号和实际凭证号不一致;(待解决)
4.4 分布式事务执行顺序未控制,目前异步执行的分布式事务,未控制执行顺序,例如删除凭证后再生成,删除反写后执行会导致反写的凭证标记丢失(已有方案,待解决)
4.5 并发执行的批量更新如果涉及同一批数据,还可能造成事务死锁,业务尽量避免在反写期间执行其他批量更新单据的逻辑;
总体建议:使用最新的凭证号列字段标准控件(支持凭证号过滤),去除反写逻辑,避免反写造成的分布式事务问题;
凭证生成状态反写问题排查分析
本文2024-09-22 22:53:39发表“云星瀚知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-xinghan-129537.html