Spring @Transactional, как прикрепить другой метод к одной и той же транзакции - PullRequest
0 голосов
/ 05 августа 2011

У меня проблема с подклассами конфигурации транзакций.

У меня есть класс A, у которого есть этот метод:

@Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<ModificaOperativitaRapporto> eventMessage) {
// some dao operations
        return eventMessage;
    }

Затем класс B подкласс класса A и переопределяет метод активации

 InserimentoCanaleActivator extends ModificaOperativitaRapportoActivator ....

    @Override
        @Transactional(propagation = Propagation.REQUIRES_NEW)
        public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<ModificaOperativitaRapporto> eventMessage) {
// others dao operations 
    return super.activate(eventMessage);

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

Есть идеи?

1 Ответ

1 голос
/ 05 августа 2011

Транзакция охватывает весь вызов метода в компоненте, но применяется на уровне компонента, а не на уровне реализации отдельных классов метода.В основном Spring обрабатывает транзакции с использованием AOP.Что он делает, так это помещает прокси-объект в качестве самого бина.Прокси-сервер управляет запуском транзакции, запускает метод в вашем классе реализации и затем завершает транзакцию (принятие или откат) на обратном пути.Это элегантный способ сделать это, и гораздо проще, чем любой ручной подход (с учетом ограничений Java).

Механизм прокси, когда-то примененный (из-за аннотации @Transactional плюс некоторые другие конфигурации), выглядитна тип обработки транзакции (параметр propagation для аннотации) и выбирает правильное действие.В вашем случае, если вы хотите, чтобы у суперкласса было @Transactional(propagation=REQUIRES_NEW), а у подкласса - @Transactional(propagation=REQUIRED), тогда я ожидал бы, что это сработает;аннотация суперкласса будет игнорироваться, потому что механизм аннотации сначала увидит аннотацию подкласса и перестанет смотреть.

...