Business Central SaaS 23中能否实现独立事务的in-database tracing?
在Business Central SaaS 23中实现独立事务的数据库追踪
可以实现独立于主事务的日志记录,核心是利用独立会话隔离事务上下文——Business Central中每个会话都有自己的隐式事务,不同会话的事务完全独立,主会话回滚不会影响其他会话已提交的操作。
你之前尝试的几种方案里,前三种(不同代码单元、不同扩展、单会话Pub/Sub)之所以无效,是因为它们都在同一个会话里执行,所有操作共享同一个隐式事务,主事务回滚时自然会把日志插入也一并回滚。而第4种StartSession+Pub/Sub的思路是对的,大概率是实现细节没做对,导致日志操作还是没脱离主会话的事务。
正确的实现方式
直接通过StartSession开启独立会话,在新会话中执行日志插入逻辑:
- 创建专门的日志代码单元,比如
Codeunit 50100 "Tracing Log Writer",里面写插入自定义日志表的逻辑,确保代码里没有依赖主会话的事务资源。 - 在主流程需要记录日志的地方,调用
StartSession启动这个日志代码单元:
// 初始化会话设置,传递日志参数 SessionSettings.SetCompany(CompanyName); SessionSettings.SetUserId(UserId); SessionSettings.AddVariable('LogContent', '主流程执行到XX步骤'); SessionSettings.AddVariable('LogLevel', 'Info'); // 启动独立会话执行日志写入 StartSession(Codeunit::"Tracing Log Writer", SessionSettings);
- 在日志代码单元的
OnRun触发器里,读取传递的参数并插入日志表,这个操作会在新会话的独立事务中执行,提交后不受主会话回滚影响。
注意事项
- SaaS环境下,
StartSession的调用频率要控制,避免过多会话导致性能问题,比如批量日志可以合并后一次性写入。 - 日志表要设计必要的字段:会话ID、时间戳、日志级别、操作内容、主流程关联ID等,方便后续追踪排查。
- 不要在日志代码单元中调用主会话的事务相关操作(比如访问主会话中未提交的记录),确保完全隔离。
如果暂时没调试通独立会话的方案,内存缓冲到Commit再写入是备选,但确实不够灵活——比如主流程长时间运行还没Commit时,无法实时查看日志,而且如果进程意外崩溃,缓冲的日志会丢失。
内容的提问来源于stack exchange,提问作者David-SkyMesh
相关产品推荐
相关产品推荐

