Всем привет!
Переделываю бины, в которых транзакции управляются контейнером на управляемые бином.
Есть несколько вопросов:
— если в методе бина с типом транзакции Container метод выбросит исключение, но setRollbackOnly() не был вызван — при каких типах исключений сервер для транзакции сделает откат?
— в методе (methodA) бина с типом транзакции Container вызываются другие методы (methodB) других бинов. Один из таких бинов имеет тип транзакции Bean.
Так как одном из предыдущих методов мог быть вызван setRollbackOnly(), то я в методе methodB перед тем как открыть транзакцию, проверяю ее состояние на Status.STATUS_ACTIVE — если метод вызывает внутри какой-то транзакции, то новой не открываю. А перед комитом проверяю на Status.STATUS_ROLLEDBACK и Status.STATUS_ROLLING_BACK. Нужно ли перед комитом проверять на еще какие-то состояния
Выглядит это как-то так
public void methodB(){
UserTransaction transaction=context.getUserTransaction();
try{
if(transaction.getStatus()!=Status.STATUS_ACTIVE)
transaction.begin();
//process logic
if(transaction.getStatus()!=Status.STATUS_ROLLEDBACK && transaction.getStatus()!=Status.STATUS_ROLLING_BACK)
transaction.commit();
else
throw new Exception("rollback");
}catch(Exception e){
transaction.rollback
}
}
Сложно читается вопрос.
>при каких типах исключений сервер для транзакции сделает откат
Если это не бизнес исключение. См. спецификацию или туториал.
А>Как нужно начать и закомитить транзакцию в method2 если он вызывается из method1 ?
Через JTA берем и коммитим.
На метод method2 попробуйте поставить аттрибут транзакции NotSupported в ejb-деплоймент-дискрипторе.
Вообще тема сложная.
Читайте
http://java.sun.com/javaee/5/docs/tutorial/doc/bncih.html
если не получится.