Несколько менеджеров транзакций в Spring JPA

Я хочу использовать два менеджера транзакций следующим образом

 <bean id="transactionManagerReadOnly" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactoryReadOnly" />
    </bean>

    <bean id="transactionManagerReadWrite" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactoryReadWrite" />
    </bean>

и в моем коде присутствуют теги tx:annotation-driven, например, следующие

 <tx:annotation-driven  mode="aspectj" transaction-manager="transactionManagerReadWrite"/>

  <tx:annotation-driven mode="aspectj" transaction-manager="transactionManagerReadOnly"/> 

но я где-то читал, что должен присутствовать только один tx:annotation-driven и ссылаться на другой менеджер транзакций, указав в теге @Transaction, например, следующее

@Transactional("transactionManagerReadWrite")
@Transactional("transactionManagerReadOnly")

Ниже приведены мои вопросы и запросы

  1. Какой менеджер транзакций считается допустимым кандидатом для @Transactional, если в файле конфигурации присутствуют два менеджера транзакций и два тега tx:annotation-driven, если мы не указываем имя менеджера транзакций явно в аннотации @Transactional?
  2. Каким будет режим второго менеджера транзакций, если в приложении рекомендуется иметь только один тег tx:annotation-driven, а режим мы указываем только в теге tx:annotation-driven? то есть режим Springs по умолчанию - это режим прокси, и я хочу использовать два менеджера транзакций с режимом аспекта.
  3. Как указать режим aspectj для второго менеджера транзакций, если мы можем использовать только один тег tx:annotation-driven, а режим по умолчанию - режим proxy весной?

person Pawan Patil    schedule 25.09.2019    source источник
comment
У вас может быть только 1 <tx:annotation-driven />, и то, что вы указываете там, является используемым менеджером транзакций по умолчанию. Вы также указываете режим для использования (прокси или аспект), это будет применяться ко всем аннотациям @Transactional. По умолчанию будет использоваться диспетчер tx по умолчанию, если он не указан в аннотации @Transactional.   -  person M. Deinum    schedule 25.09.2019
comment
@ M.Deinum M.Deinum, как указать режим aspctj для второго менеджера транзакций?   -  person Pawan Patil    schedule 25.09.2019
comment
Вам не нужно указывать это... Режим устанавливается глобально и не зависит от того, какой tx-менеджер используется. Что он делает, так это то, как интерпретировать @Transactional аннотации либо прокси, либо аспект, и не имеет ничего общего с тем, сколько у вас tx-менеджеров.   -  person M. Deinum    schedule 25.09.2019
comment
Таким образом, вы хотите сказать, что в моем случае набор аспектов для transactionManagerReadWrite будет применяться и для transactionManagerReadOnly, даже если я не укажу transactionManagerReadOnly в теге, управляемом tx:annotation?   -  person Pawan Patil    schedule 25.09.2019
comment
да. Существует только один аспект транзакции, который использует либо диспетчер tx, как указано в @Transactional, либо по умолчанию, если он не указан. Это не зависит от того, какие и сколько tx-менеджеров у вас есть, какой режим применяется. Тот факт, что существует только один аспект транзакции, также является причиной того, что может быть только один <tx:annotation-driven />, поскольку он будет настраивать глобально используемый (по умолчанию) менеджер транзакций.   -  person M. Deinum    schedule 25.09.2019
comment
@ M.Deinum M.Deinum, у вас есть ссылка на документацию по этому поводу?   -  person Pawan Patil    schedule 25.09.2019
comment
@M.Deinum, пожалуйста, добавьте свои комментарии в раздел ответов.   -  person Pawan Patil    schedule 25.09.2019


Ответы (1)


У вас может быть только один <tx:annotation-driven />, настроенный на то, как обрабатываются @Transactional аннотации. Вы указываете режим (proxy или aspectj) и менеджер транзакций по умолчанию для связи с аннотациями @Transactional.

Таким образом, аспект либо применяется через прокси (режим proxy), либо загружается или переплетается во время компиляции (режим aspectj). Существует только 1 аспект, и этот аспект либо использует диспетчер транзакций по умолчанию, либо тот, который определен в аннотации @Transactional.

Учитывая, что вы указали режим aspectj и transactionManagerReadWrite в качестве менеджера транзакций по умолчанию

<tx:annotation-driven  mode="aspectj" transaction-manager="transactionManagerReadWrite"/>

Теперь при использовании простого @Transactional будет использоваться transactionManagerReadWrite, при использовании @Transactional("transactionManagerReadOnly") будет использоваться transactionManagerReadOnly. Любой из них будет включен, так как aspectj используется в качестве режима для применения транзакций.

person M. Deinum    schedule 25.09.2019
comment
поэтому режим аспекта будет применяться к обоим менеджерам транзакций, то есть к transactionManagerReadWrite и transactionManagerReadOnly. - person Pawan Patil; 25.09.2019
comment
режим не имеет ничего общего с менеджерами транзакций... Существует только 1 компонент, применяющий транзакции в аспекте транзакций. Режим определяет, как это применяется... - person M. Deinum; 25.09.2019
comment
Понял Спасибо за информацию. у вас есть ссылка на документацию? - person Pawan Patil; 25.09.2019