Возникла проблема с несколькими менеджерами транзакций
У меня есть два менеджера транзакций, определенных в двух отдельных файлах Spring XML, и оба они загружены в контексте Spring
Файл Один
<tx:annotation-driven transaction-manager="transactionManager1"/>
<bean id="transactionManager1"
class="org.springframework.jdbc.DataSourceTransactionManager">
...
</bean>
Файл Два
<tx:annotation-driven transaction-manager="transactionManager2"/>
<bean id="transactionManager2"
class="org.springframework.jdbc.DataSourceTransactionManager">
...
</bean>
Если я не указал какой-либо определитель для нижеприведенного сервиса, какой диспетчер транзакций будет использовать Spring.
public class TransactionalService {
@Transactional
public void setSomething(String name) { ... }
@Transactional
public void doSomething() { ... }
}
1 ответ
Проверьте 11.5.6 Использование @Transactional из официальной документации:
Вы можете опустить
transaction-manager
атрибут в<tx:annotation-driven/>
тег, если имя бинаPlatformTransactionManager
что вы хотите подключить имеет имяtransactionManager
, ЕслиPlatformTransactionManager
bean-компонент, который вы хотите добавить в зависимость, имеет любое другое имя, тогда вы должны использоватьtransaction-manager
атрибут явно [...]
Так как ни один из ваших менеджеров транзакций не назван transactionManager
, вы должны указать, какой менеджер транзакций следует использовать для методов, помеченных как @Transactional
,
ОБНОВЛЕНИЕ: для решения вашего измененного вопроса. Вы можете указать, какой менеджер транзакций использовать @Transactional
аннотация (см.: @Transactional.value()
):
@Transactional("transactionManager1")
//...
@Transactional("transactionManager2")
//...
Однако я вижу несколько проблем с вашей текущей настройкой:
вы определяете
<tx:annotation-driven/>
дважды с разными менеджерами транзакций. Я не думаю, что такая конфигурация действительнабез указания менеджера транзакций, какой из них следует использовать?
Я думаю, что решение должно работать, чтобы определить <tx:annotation-driven transaction-manager="transactionManager1"/>
один раз и использовать @Transactional
использовать первый менеджер и @Transactional("transactionManager2")
использовать второй. Или наоборот.