Hardtransactionraii
Что такое transactional rollback через RAII?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
При многошаговой операции с возможностью отката: ScopeGuard выполняет rollback в деструкторе, только если не был вызван commit. Это реализация strong exception guarantee.
template<class F>
class RollbackGuard {
F f_; bool committed_ = false;
public:
explicit RollbackGuard(F f) : f_(std::move(f)) {}
~RollbackGuard() { if (!committed_) f_(); }
void commit() noexcept { committed_ = true; }
};
void transfer(Account& from, Account& to, int amount) {
from.withdraw(amount);
RollbackGuard g([&]{ from.deposit(amount); }); // откат при throw
to.deposit(amount); // если бросит — withdraw вернётся
g.commit(); // успех — rollback отменён
}С std::uncaught_exceptions() можно различать нормальный выход и выход через исключение.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.