Unit of Work の End メソッドで例外が発生した場合に、Saga データが NServiceBus の RavenDB に保存されるのを回避する方法 (分散トランザクションに登録する以外) はありますか?
DTC を使用しないように NSB 4.1 をセットアップしました
NServiceBus.Configure.Transactions
.Enable()
.Advanced(action => action.DisableDistributedTransactions());
データベースへの変更をコミットするときに、制約やタイムアウト、またはデータベースで予期しない何かが原因で失敗する可能性がある SqlUnitOfWork があります。
public class SqlUnitOfWork : IManageUnitsOfWork
{
...
public void End(Exception ex = null)
{
if (ex == null)
datacontext.SubmitChanges(); //this could throw an exception
}
}
そこで例外が発生すると、メッセージは再試行されますが、saga は既に ravendb に保存されています。私が見つけた回避策は、Unit of Work を使用せず、メッセージ ハンドラーの Handle メソッドの最後に変更を送信することでしたが、トランスポート メッセージに複数の論理メッセージがある場合はうまく機能しません。
これを達成する賢い方法はありますか?