我正在运行一个包含SqlWorkflowPersistenceService&的工作流运行时。 SqlTrackingService(IsTransactional = true)
WorkflowInstance workflowInstance = _workflowRuntime.CreateWorkflow(workflowType);
workflowInstance.Start();
// Assure persistence
workflowInstance.Unload(); // Error occur here
workflowInstance.Load();
我得到的错误是:
PersistenceException "Cannot access a disposed object.\r\nObject name: 'Transaction'."
at System.Workflow.Runtime.WorkflowExecutor.Persist(Activity dynamicActivity, Boolean unlock, Boolean needsCompensation)
at System.Workflow.Runtime.WorkflowExecutor.PerformUnloading(Boolean handleExceptions)
at System.Workflow.Runtime.WorkflowExecutor.Unload()
at System.Workflow.Runtime.WorkflowInstance.Unload()
如果我没有添加SqlTrackingService或将其设置为“IsTransactional”为true,那么一切正常
编辑:仅在使用远程数据库时才会出现此错误。如果从数据库计算机执行它,则完全相同的代码将起作用。
答案 0 :(得分:1)
之前我没有看到过这个错误,但可能有助于调试的是IsTransactional设置。这个名称有点误导,实际上意味着批量更新到tyhe数据库,直到达到持久性点。当调用UnLoad()时,这是一个持久性点,并且IsTransactional = true,所有跟踪记录都将被保留。当IsTransactional = false时,它们会在创建后立即保留。
可能涉及的是DTC。即使您使用相同的数据库进行跟踪和持久化,也会打开多个连接,从而导致分布式事务,除非您使用的是SharedConnectionWorkflowCommitWorkBatchService。
答案 1 :(得分:1)
问题解决了。
SharedConnectionWorkflowCommitWorkBatchService不是答案。 使用它只是部分解决方案,因为:
真正的问题 - DTC被禁用
从Windows XP SP2开始,默认情况下禁用 MSDTC (Microsoft分布式事务处理协调器)的网络访问。
如何修复 - 为MSDTC启用网络访问: