多くのテーブルで動作し、かなりの数のSQLコマンドを実行する非常に複雑なビジネスロジックを実現するための支援が必要です。ただし、データが不整合な状態のままにならないようにしたいので、現時点では、ネストされたトランザクションを必要としないソリューションは見当たりません。達成したいシナリオに似たシナリオを示す簡単な擬似コードを作成しました。
Dictionary<int, bool> opSucceeded = new Dictionary<int, bool> ();
for (int i = 0; i < 10; i++)
{
try
{
// this operation must be atomic
Operation(dbContext, i);
// commit (?)
opSucceeded[i] = true;
}
catch
{
// ignore
}
}
try
{
// this operation must know which Operation(i) has succeeded;
// it also must be atomic
FinalOperation(dbContext, opSucceeded);
// commit all
}
catch
{
// rollback FinalOperation and operation(i) where opSucceeded[i] == true
}
私にとって最大の問題は、FinalOperationが失敗した場合に、成功したすべての操作Operation(i)がロールバックされるようにする方法です。また、単一のOperation(i)の失敗を無視できるようにしたいと思います。
ネストされたTransactionScopeオブジェクトを使用してこれを実現することは可能ですか?そうでない場合は、そのような問題にどのようにアプローチしますか?