Если ваша программа перехватывает исключение времени выполнения, что означает, что исключение не достигло контейнера JEE, следовательно, с точки зрения контейнера JEE это нормальное выполнение программы, поэтому она не будет выполнять откат транзакции.
Если вы хотите перехватить исключение во время выполнения, а также откатить транзакцию, вам необходимо программно откатить транзакцию для этого конкретного исключения во время выполнения. В сессионном компоненте он предоставляет объект sessioncontext, который имеет метод setRollbackOnly, с помощью этого метода вы можете сообщить контейнеру об откате транзакции, не вызывая исключения времени выполнения. Компонент, управляемый сообщениями, также предоставляет объект messagedrivencontext, который можно использовать для отката транзакции [проверьте MDB https://docs.oracle.com/javaee/6/tutorial/doc/bnbpo.html]