2009-08-26 5 views
0

を使用しているとき、私は私が得ているエラーがある(真IsTransactional =と)SqlWorkflowPersistenceService & SqlTrackingServiceSqlWorkflowPersistenceService&SqlTrackingService

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

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

が含まれているワークフローランタイムを実行しているWFの奇妙な例外:

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を追加したり、真

01には「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