Transaction pattern

Procurando uma luz.

Tenho a seguinte situação, um sistema de chamados, cada chamado pode ter várias ações e cada ação pode ter suas particularidades, até aí tranquilo. Na hora de finalizar um chamado, tenho de percorrer todas as ações e seus desdobramentos para ver se existe alguma inconformidade de acordo com a lógica de negócio e devo fechando cada desdobramento, e ação associados. Contudo nesse processo eu posso achar uma inconformidade e ter de cancelar tudo.

Esse é o problema, eu teria duas abordagens, uma eu avalio todas as ações e desdobramentos para ver se posso finalizar, se não tiver nenhuma inconformidade, percorro tudo novamente fechando tudo e fecho o chamado, caso contrário não.

Outra possibilidade, seria de alguma forma implementar um rollback, a medida que vou validando, vou finalizando e se achar alguma inconformidade desfaço o que foi finalizado.

Eu gostaria de entender se tem uma forma decente de implementar essa segunda abordagem. Eu pensei em implementar commands, e agrupá-los numa transação, mas não vi como armazenar o estado anterior de cada command. nem como fazer no caso dos command atualizarem mais de um objeto.

Qualquer idéia é bem vinda.

Acho que o que você tá precisando é uma Unit of Work. Mas acho que a explicação completa dele só tem no livro mesmo.

Maurício até cheguei nessa página, quando pesquisei por “transaction pattern” com a explicação dá para ter uma idéia, mas realmente sem o texto completo ou um exemplo fica um pouco nebuloso como ele mantém tudo coeso.

Continuando minhas pesquisas de como fazer isso.

No Head First Design Patterns cita o Undo associado ao Command, mas nesse caso ele guarda o estado anterior, no meu caso o estado anterior seria um objeto inteiro. Isso não seria o maior problema, o problema, tem a ver com as possíveis collections que um objeto possua. Alguma idéia de como guardar a situação anterior, para poder fazer um rollback?

Pensando alto: algo como interceptar qq alteração numa collection (acredito q provavelmente usando AOP), basicamente (add, remove) e manter uma lista de ações para dar o rollback?