Если я слежу за вашим вопросом, вы хотите провести серию операций с базой данных и собрать достаточно информации, чтобы определить, успешна ли каждая операция или нет (словарь в вашем упрощенном коде).
Оттуда у вас есть последняя операция, которая должна откатить все успешные операции с более ранних, если она сама себя не даст.
Казалось бы, это именно тот случай, для которого предназначена простая транзакция. Нет необходимости отслеживать успех или неудачу дочерних / ранних операций, пока сбой последней операции откатывает всю транзакцию назад (здесь предполагается, что FinalOperation не использует эту информацию по другим причинам).
Просто запустите транзакцию перед тем, как войти в описанный блок, и зафиксируйте или откатите все после того, как вы узнаете статус вашей FinalOperation. Нет необходимости вкладывать дочерние операции, насколько я вижу из вашего текущего описания.
Возможно, я что-то упустил? (Обратите внимание, если вы хотите ОСТАНОВИТЬ более ранние / дочерние операции, это было бы что-то совершенно другое ... но неудача финальной операции, откатившей весь пакет операций назад, делает простую транзакцию пригодной для использования).