You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Business Central SaaS 23中能否实现独立事务的in-database tracing?

在Business Central SaaS 23中实现独立事务的数据库追踪

可以实现独立于主事务的日志记录,核心是利用独立会话隔离事务上下文——Business Central中每个会话都有自己的隐式事务,不同会话的事务完全独立,主会话回滚不会影响其他会话已提交的操作。

你之前尝试的几种方案里,前三种(不同代码单元、不同扩展、单会话Pub/Sub)之所以无效,是因为它们都在同一个会话里执行,所有操作共享同一个隐式事务,主事务回滚时自然会把日志插入也一并回滚。而第4种StartSession+Pub/Sub的思路是对的,大概率是实现细节没做对,导致日志操作还是没脱离主会话的事务。

正确的实现方式

直接通过StartSession开启独立会话,在新会话中执行日志插入逻辑:

  1. 创建专门的日志代码单元,比如Codeunit 50100 "Tracing Log Writer",里面写插入自定义日志表的逻辑,确保代码里没有依赖主会话的事务资源。
  2. 在主流程需要记录日志的地方,调用StartSession启动这个日志代码单元:
// 初始化会话设置,传递日志参数
SessionSettings.SetCompany(CompanyName);
SessionSettings.SetUserId(UserId);
SessionSettings.AddVariable('LogContent', '主流程执行到XX步骤');
SessionSettings.AddVariable('LogLevel', 'Info');

// 启动独立会话执行日志写入
StartSession(Codeunit::"Tracing Log Writer", SessionSettings);
  1. 在日志代码单元的OnRun触发器里,读取传递的参数并插入日志表,这个操作会在新会话的独立事务中执行,提交后不受主会话回滚影响。

注意事项

  • SaaS环境下,StartSession的调用频率要控制,避免过多会话导致性能问题,比如批量日志可以合并后一次性写入。
  • 日志表要设计必要的字段:会话ID、时间戳、日志级别、操作内容、主流程关联ID等,方便后续追踪排查。
  • 不要在日志代码单元中调用主会话的事务相关操作(比如访问主会话中未提交的记录),确保完全隔离。

如果暂时没调试通独立会话的方案,内存缓冲到Commit再写入是备选,但确实不够灵活——比如主流程长时间运行还没Commit时,无法实时查看日志,而且如果进程意外崩溃,缓冲的日志会丢失。

内容的提问来源于stack exchange,提问作者David-SkyMesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:40:34