2009-08-26 50 views
0

我運行一個包含SqlWorkflowPersistenceService & SqlTrackingService一個工作流運行時(與IsTransactional =真)對WF一個奇怪的異常使用SqlWorkflowPersistenceService&SqlTrackingService

WorkflowInstance workflowInstance = _workflowRuntime.CreateWorkflow(workflowType); 
workflowInstance.Start(); 

// Assure persistence 
workflowInstance.Unload(); // Error occur here 
workflowInstance.Load(); 

我得到的錯誤是:

如果我不添加SqlTrackingService或設置它的「IsTransactional」真

一切正常

編輯:此錯誤使用遠程數據庫時纔會發生。如果從數據庫計算機執行完全相同的代碼,它將起作用。

回答

1

問題已解決。

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」。確認所有更改。
1

我還沒有看到這個錯誤之前,但一些可能在調試,這是IsTransactional設置幫助。這個名字有點誤導,真的意味着批量更新數據庫,直到達到持久點。當UnLoad()被調用時,這是一個持久點,並且IsTransactional = true,所有的跟蹤記錄都將被持久化。當IsTransactional = false時,它們在創建後立即保留。

東西可能參與是DTC。即使您使用跟蹤和持久性相同的數據庫,也會打開多個連接,導致分佈式事務,除非您使用SharedConnectionWorkflowCommitWorkBatchService。

+0

謝謝。它工作得很好 - 但只是一個解決方法。如果持久性和跟蹤服務都在同一個數據庫上,SharedConnectionWorkflowCommitWorkBatchService將可以工作,而且我不想阻止將它們分隔到不同DB的選項。 – HuBeZa 2009-08-26 12:55:42