Ok, vamos por partes.
O fato de voce estar usando BMP, acredito que nao faca diferenca. Acredito que o funcionamento seja semelhante aos CMP, quanto a transacao.
O melhor lugar para voce iniciar a transacao eh realmente no facade, no seu session bean. Isso dara mais performance. Caso voce nao inicie a transacao no no session, cada chamada para o entity bean criara uma nova transacao.
Sobre transacao nos containers voce tem duas opcoes: a Containter Managed Transaction (CMT) e Bean Managed Transaction (BMT). Cada uma tem suas peculiaridades. O setRollBackOnly que voce citou, por exemplo, eh uma pertencente ao CMT. Ja no BMT voce usa todo o potencial da JTA.
O CMT eh um sistema de transacao declarativa, voce seta as caracteristicas da transacao no xml de deploy (ejb-jar.xml). Ja no JTA voce tem todo o poder de dar um begin/commit/rollback onde quiser. Ja no CMT voce sempre esta preso a granularidade de metodo. Voce inicia a transacao no inicio do metodo e commit ou cancela ao fim do metodo.
No CMT, se voce quiser fazer duas transacoes independentes no mesmo metodo nao da. Nao tem como dar um commit numa transacao , startar outra. Alem disso se voce quiser que uma transacao perdure entre metodos tambem eh impossivel com o CMT.
TOdas essas limitacoes descritas do CMT nao ocorrem no BMT. No BMT voce requisita uma transacao ao container, pode armazenar essa transacao em variaveis da sua classe (ja que estas usando Statefull) e reutiliza-la entre metodos. Vou dar um exemplo, sem me preocupar com as excessoes que ele pode gerar:
public class Statefull extends SessionBean {
transient private UserTransaction utx;
public void ejbCreate() {
utx = context.getUserTransaction();
}
public void acao1() {
// Acoes nos entity
}
public void acao2() {
// Acoes nos entity
}
public void commit() {
utx.commit();
}
public void rollback() {
utx.rollback();
}
}
La da parte web da sua aplicacao voce poderia criar esse Statefull e chamar quantas vezes quiser a acao1, acao2, nas ordens que voce quiser e por fim dar um commit ou rollback. Tudo estaria na mesma transacao.
Isso pode ate nao ser uma boa arquitetura de software, pode gerar dead locks, se o commit/rollback for “esquecido” pela parte web, mas eh uma possibilidade que o J2EE permite.
No seu post voce comentou sobre o commit. o commit nao eh nada obrigatorio no JDBC. se voce realiza somente leitura, consulta, nao precisa dar commit nem rollback.
Resumindo: BMT te da todo o poder que voce possa querer. Ja no CMT, o container tipo, bota no inicio do seu metodo um begin, e no fim do metodo ele ve. Foi setado o setRollBackOnly? Se sim, da rollback, se nao da commit. Para isso o metodo precisa ser declarado como um metodo transacional do tipo required, mandatory, ai eh escolher o que tu queres.
se ainda tiver duvidas eh soh dar um toque.