Смешивание транзакций в Java EE (метод, управляемый контейнером, вызывается внутри метода, управляемого бином)

Не мог найти какую-либо соответствующую информацию, кроме бесполезных учебников в Интернете, а также в спецификациях.

Есть одна вещь, с которой я борюсь сейчас, если вы можете помочь.

Вот вещь

Допустим, у нас есть две версии EJB 3.0 с аннотациями относительно их типа транзакции, одна из которых управляется компонентом (пусть это будет BeanManaged), вторая - контейнером (пусть это будет ContainerManaged, насколько креативно).

Тогда это происходит:

@TransactionBlahBlah(Type.BEAN)
class BeanManaged {

   @Inject
   private ContainerManaged contMngt; // here's the implicit container managed trnsactional bean ( not annotated or anything )

    void someMethod() {
         // some transaction creation and a bit of inserts and updates      
        contMngt.callingMethodThatIsGoingToCreateContainerManagedTransaction();

         // some batches that are inserts
        for( int y = 0 ; y < 100 ; y++ ) {
             for( int i = 100 ; i < 200 ; i ++ ) {
                    magicPreparedStatementOutOfNowhere.setParameter(666, "hell");
                    magicPreparedStatementOutOfNowhere.addBatch();
             }
             magicPreparedStatementOutOfNowhere.executeBatch();
        }
        transaction.commit(); // let's pretend it is not here
    }
}

Что происходит в механике всего этого, превращается ли управляемая компонентом транзакция в своего рода "потерянную" управляемую контейнером транзакцию? Они смешиваются? Как они взаимодействуют, если вообще? Отделяет ли одна транзакция от другой

Это мой вывод, но есть кое-что еще к этому.

В конце, когда я пытаюсь зафиксировать транзакцию компонента, он говорит: "Привет, сэр, эта транзакция управляется, и запрещается фиксировать ее вручную" с SQLException assert.

Тогда есть вещь с партиями, которые я как-то собираю. После добавления 100 пакетов я хочу выполнить их, но на самом деле выполняется только последняя, ​​похоже, addBatch не работает вообще.

Любой может рассказать, или встретил нечто подобное, приветствуется, каждый волшебник получает бесплатные куки.

1 ответ

Какой атрибут TransactionAttribute вы указали для bean-объекта, управляемого контейнером? Я бы предложил Обязательно. С Mandatory контейнер не будет запускать транзакции для вас. Вместо этого он защитит ваш компонент, гарантируя, что он не может быть вызван, если транзакция не выполняется.

Этот связанный вопрос также имеет некоторую полезную информацию.

Другие вопросы по тегам