Мне нужна помощь в реализации довольно сложной бизнес-логики, которая работает со многими таблицами и выполняет довольно много команд 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) будут отменены? Обратите внимание, что я также хотел бы иметь возможность игнорировать сбои одной операции (i).
Можно ли добиться этого с помощью вложенных объектов TransactionScope, а если нет - как бы вы подойти к такой проблеме?