Begin transaction
...update/delete/insert table...
Rollback se erro
Commit se OK em tudo
Ele mantém todos os comandos de DB em sua memória, ao invés de enviar pro DB. No final do processo, toda a pilha de comandos são enviadas pro DB. Quando a gente executa o comando DAO.flush(), os scripts que já foram processados no JPA são enviados para o banco e as instâncias tem a memória liberada. Se der um DAO.clear(), as entidades mapeadas JPA perdem suas alterações (lembrando que JPA trabalha com mapeamento de entidades). Native queries não podem ser controladas pelo JPA, por isso normalmente já são enviadas para o DB.
Begin transaction
Guarda tudo na RAM do servidor, nas instâncias internas de objetos de controle do JPA
Finaliza o método/fluxo da Business, conforme a anotação de transação (BEAN, CONTAINER, NEW_TRANSACTION..)
Após terminar o fluxo de código, ele manda tudo para o DB
...update/delete/insert table...
Rollback se erro em tudo
Commit se OK em tudo
Quando se pretende liberar recursos do server, mas tome cuidados (https://www.developerfusion.com/article/84945/flush-and-clear-or-mapping-antipatterns/)
Begin transaction
Executa o código e cada que vez que dá flush(), os comandos são enviados pro DB, mas ainda dentro da transação, i.e., sem dar commit.
...update/delete/insert table...
Finaliza o método/fluxo da Business, conforme a anotação de transação (BEAN, CONTAINER, NEW_TRANSACTION..)
Após terminar o fluxo de código, ele manda tudo que ainda não tiver enviado para o DB
Rollback se erro em tudo
Commit se OK em tudo