Eu tenho um filtro OpenSessionInView que faz a abertura, commit/rollback e fechamento de sessão.
Mas me encontrei em uma situação, onde ocorreu um erro em uma classe de serviço e eu precisava informar o usuário e dar rollback na sessão. Fazendo isso eu acabei quebrando o Filtro de OSIV porque ele não verificava se a transação já havia sido comitada e isso me fez pensar se eu tiver uma situação onde utilize vários serviços como eu lidaria com isto.
Como vocês fazem o gerenciamento de suas transações?