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