Supongamos que tengo dos funciones DoTaskA
y DoTaskB
— ambos capaces de lanzar TaskException
— con sus correspondientes funciones "rollback" UndoTaskA
y UndoTaskB
. ¿Cuál es el mejor patrón para usar para que ambos tengan éxito o ambos fallen?C++ patrón de transacción similar de Todo o Nada Trabajo
Lo mejor que tenemos ahora es
bool is_task_a_done = false,
is_task_b_done = false;
try {
DoTaskA();
is_task_a_done = true;
DoTaskB();
is_task_b_done = true;
} catch (TaskException &e) {
// Before rethrowing, undo any partial work.
if (is_task_b_done) {
UndoTaskB();
}
if (is_task_a_done) {
UndoTaskA();
}
throw;
}
Sé que is_task_b_done
es innecesaria, pero tal vez bueno para mostrar código de simetría en caso añadimos una tercera o una cuarta tarea más adelante.
No me gusta este código debido a las variables booleanas auxiliares. Quizás hay algo en el nuevo C++ 11 del que no tengo conocimiento, ¿cuál puede codificarlo mejor?
Si está dentro del bloque catch, 'is_task_b_done' siempre es' falso' – SuperSaiyan
Lo sé, he agregado el comentario de que solo está ahí para la simetría del código en caso de que agreguemos una tercera o cuarta tarea. – kirakun
¿Su aplicación tiene varios subprocesos? ¿Has echado un vistazo a [RAII] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)? – dirkgently