DAO e transações de db

Pessoal,
eu estava implementando o pattern DAO num modelo que tenho e fiquei em duvida de como implementar as transações de bd quando a mesma requer mais de uma operação em classes DAO.

Por exemplo, se eu tiver uma operação no meu objeto de negócio que altera dados em mais classes DAO, sendo que a operação só deve ser gravada (commit) no bd se for executada por completo, senão deve ser emitido erro e desfeitas as alterações (rollback)…

Fiquei confuso onde vou iniciar a transação. Na documentação DAO da Sun ela sugere colocar o create connection para pegar uma conexao com o bd nas classes que implementam o DAO, mas neste caso, se eu entendi direito, a transação se resume a métodos nestas classes. Sem contar que estas classes DAO deveriam ter apenas métodos CRUD, ou não?

Então presumi que eu deveria criar ou pegar a connection na classe de negócio… mas aí me deparei com outro problema, pois eu não quero deixar o negócio dependente de bd, haja vista que posso querer mudar a implementação no futuro para um prevayler ou coisa parecida.

Pensei em utilizar uma especie de SessionFactory para criar a sessão com os atributos necessários para cada tipo de fonte de dados, no caso do bd teria um atributo do tipo Connection, etc…, sendo que esta seria passada de parâmetro para os DAOs.

Não sei se estou no caminho certo, ou se consegui me fazer entender…
Antes que me esqueça, estou utilizando no modelo: classes de negócio (por exemplo: Aluno), interfaces DAO (AlunoDAO), classes que implementam o DAO (JDBCAlunoDAO), uma AbstractFactory (DAOFactory) e uma Factory os DAOs (JDBCDAOFactory)… talvez vocês me digam que não seja necessário tudo isso, mas estou querendo implementar o pattern DAO completo para estudo…

Até!

Bom, o maior problema aqui é que sua camada de negócios não é transacional, só o banco.

Já sendo ‘chato’, acho que se você possui encessidade de transações em seu sistema, deveria pensar em como sua regra de negócio se comporta sem a transação, e problemas que pdoe ter com isso.

Especificamente sobre como DAO fazer transações, creio que você vai precisar de um coordenador para esta transação toda, o DAO em si não deveria estar responsável por conhecer, executar, commit, rollback… é melhor você dar este trabalhão rpa outro maluco ae :wink:

Linkzinhos Bombando:
http://www-106.ibm.com/developerworks/java/library/j-dao/
http://www.javaworld.com/javaworld/jw-03-2002/jw-0301-dao_p.html
http://archives.java.sun.com/cgi-bin/wa?A2=ind0208&L=j2ee-interest&F=&S=&P=4316

[]s

Também me deparo com este problema constantemente, e o que temos feito aqui é pegar a conexão no delegate e passar para os DAOs.

Eu considero isso uma tarefa inadequada para o delegate.
Gostaria de saber tbm qual seria uma boa solução pra este problema.