最近、WFでExternalDataExchangeベースの通信をいくつか使用しています。私の理解では、長時間実行される (この場合はステート マシン) ワークフローを使用する場合、通信はキューに入れられ、耐久性があり、トランザクションです。
SQL Persistence と、「WaitForIdle = true」とマークされた EventArgs を使用しています。
私は次のようなことをすると思います:
using(TransactionScope scope = new TransactionScope())
{
IMyEDEService service = wfRuntime.GetService<IMyEDEService>()
service.MyMethod(wfInstanceGuid, "Here's some data");
DoSomeDatabaseWork();
} //Dispose causes scope to rollback
ワークフローでイベントが発生しないことが予想されます。ただし、実際には配信されているように見えるので、これはトランザクションではないと思います。DoSomeDatabaseWork() でデータベースにコミットされたデータがどのようにロールバックされるかを確認できましたが、前に進むワークフローがうまくいかない可能性があります。
誰でもこれを確認できますか? もしそうなら、メッセージをトランザクション化するための回避策はありますか?
本当に欲しいのは、次の2つのいずれかです。
- ワークフローは、メッセージをエンキューしたトランザクションがコミットされるまで、外部データ交換を介してエンキューしたメッセージに反応するべきではありません (SQL サーバーでサービス ブローカーが行うのと同じように)。
- また -
- 配信したイベントに対してワークフローが動作を開始した場合は、ロールバックも行う必要があります。ただし、デフォルトのスケジューラを使用してこれがどのように発生するかはわかりません。ワークフローの実行を非同期のままにしたいので、必要がなければスケジューラーを切り替えたくありません。