【问题标题】:A strange exception on WF when using SqlWorkflowPersistenceService & SqlTrackingService使用 SqlWorkflowPersistenceService 和 SqlTrackingService 时 WF 出现一个奇怪的异常
【发布时间】:2009-08-26 11:17:49
【问题描述】:

我正在运行一个包含 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,则一切正常


编辑:此错误仅在使用远程数据库时发生。如果从数据库计算机执行,完全相同的代码将起作用。

【问题讨论】:

    标签: c# .net workflow-foundation


    【解决方案1】:

    我以前没有看到过这个错误,但是 IsTransactional 设置可能有助于调试。这个名称有点误导,实际上意味着对数据库进行批量更新,直到达到持久性点。当调用 UnLoad() 时,这是一个持久性点,并且 IsTransactional = true 所有跟踪记录都将被持久化。当 IsTransactional = false 时,它​​们会在创建后立即持久化。

    可能会涉及到 DTC。即使您使用同一个数据库进行跟踪和持久化,也会打开多个连接,从而导致分布式事务,除非您使用的是 SharedConnectionWorkflowCommitWorkBatchService。

    【讨论】:

    • 谢谢。它工作得很好 - 但只是作为一种解决方法。如果持久性和跟踪服务都在同一个数据库上,SharedConnectionWorkflowCommitWorkBatchService 将起作用,并且我不想阻止将它们分离到不同数据库的选项。
    【解决方案2】:

    问题解决了。

    SharedConnectionWorkflowCommitWorkBatchService 不是答案。 使用它只是部分解决方案,因为:

    1. 只有当您的两个持久性和跟踪服务在同一个数据库上时,它才会起作用。
    2. 您将无法在事务中提升事务(例如,在事务范围内更新数据库记录)。它会抛出异常。

    真正的问题 - DTC 已禁用
    从 Windows XP SP2 开始,默认情况下禁用 MSDTC(Microsoft 分布式事务协调器)的网络访问。

    如何解决 - 为 MSDTC 启用网络访问:

    1. 开始菜单 -> 程序 -> 管理工具 -> 组件服务
    2. 控制台根目录 -> 组件服务 -> 计算机 -> 我的电脑 -> 右键单击​​它并选择属性。
    3. 选择 MSDTC,然后单击安全配置。
    4. 启用“网络 DTC 访问”、“允许远程客户端”、“允许远程管理”、“允许入站”、“允许出站”、“启用 TIP 事务”和“启用 XA 事务”。
    5. 确认所有更改并关闭窗口。
    6. 如果您运行 Windows 防火墙,那么您应该为 MSDTC 打开一个例外。转到“控制面板”->“安全中心”->“Windows 防火墙”->“例外”->“添加程序”->“浏览”并选择“C:\WINDOWS\system32\msdtc.exe”。确认所有更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多