Spring — привыкнуть к TransactionManager

#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 . Но не то, чтобы оба предназначались для внутреннего использования, и вам не следует полагаться на них во многих местах вашего кода.