#java #spring #transactions
#java #spring #транзакции
Вопрос:
У меня есть два менеджера транзакций, и мне было любопытно, есть ли какая-то возможность получить тот, который был использован.
Чтобы быть более конкретным, как можно underlyingMethod(..)
узнать, какой TransactionManager использовался (без отправки ему дополнительного параметра «transactionManagerName / Ref»):
@Transactional("transactionManager1")
public void transactionFromFirstTM() {
someClass.underlyingMethod()
}
@Transactional("transactionManager2")
public void transactionFromSecondTM() {
someClass.underlyingMethod()
}
?
хорошо, я использовал это, чтобы получить сеанс гибернации из фактического диспетчера транзакций:
protected Session getSession() {
Map<Object, Object> resourceMap = TransactionSynchronizationManager.getResourceMap();
Session session = null;
for (Object value : resourceMap.values()) {
if (value instanceof SessionHolder) {
session = ((SessionHolder) value).getSession();
break;
}
}
return session;
}
Комментарии:
1. первоначальный план состоял в том, чтобы иметь две базы данных, и правильная из них была бы выбрана просто путем определения связанного имени TransactionManager в аннотации транзакции (поведение кода в остальном должно быть идентичным для обеих баз данных)
Ответ №1:
Я не думаю, что вы можете, но вы не должны ничего делать с менеджером транзакций. Некоторые действия над текущей транзакцией доступны в TransactionSynchronizationManager
Другим полезным классом является TransactionAspectUtils
. Но не то, чтобы оба предназначались для внутреннего использования, и вам не следует полагаться на них во многих местах вашего кода.