2016-12-06 3 views
1

Учтем:Транзакционная аннотация весной - как она работает?

delete() 
    update() 
    insert() 
    @Transactional 
    void doDBstuff(){ 
     delete() 
     update() 
     insert 
    } 

Как вы можете видеть только doDBstuff. Он вызывает другой метод (delete, update, insert). Все они используют mybatis для работы с базой данных.

Сообщите мне, пожалуйста, если это @Transactional аннотация должна работать. Я тестировал его вручную, и, похоже, все в порядке, однако я хочу быть уверенным и лучше понять, как это работает.

Так что я отвечаю на вопросы:
1. Безопасен ли он?
2. Как это работает? Я знаю, что это сложно. Я имею в виду только некоторую интуицию, грубый взгляд на тему.

+2

Ваш фреймворк (возможно, Spring) будет искать все бобы, которые имеют методы, аннотированные с помощью '@ Transactional' (вероятно, потому, что вы сказали это в своей весенней конфигурации, используя' 'или что-то еще) , Затем он будет придерживаться кода котельной плиты вокруг этих методов (используя АОП), чтобы начать транзакцию и зафиксировать ее, когда она закончится. Он может выполнить откат, если метод генерирует исключение. – BretC

+0

Это может сделать откат? Я думал, что он должен сделать откат. Так что это нормально, когда дело доходит до транзакции? Не имеет значения, что называемые методы arent аннотированы? И я не настраиваю его. У меня весенняя обувь. –

+0

Я думал, что это зависит от того, что вы ввели в качестве значения аннотации «rollbackFor», но я могу ошибаться ... – BretC

ответ

3

@Transactional работает как большинство других магии весной, прокси (или нет, если вы используете AspectJ). Если вы введете компонент, в котором есть какие-либо аннотации @Transactional, Spring Framework автоматически подключает прокси-сервер, чтобы гарантировать, что любые вызовы методов @Transactional будут завернуты в транзакцию в соответствии с аннотацией (и откатываются, если возникает исключение).

Относительно того, будет ли ваш код фактически выполняться в транзакции или нет. Если вы используете AspectJ, тогда да, он будет работать в транзакции, как ожидалось, в конце истории. Если вы не используете AspectJ, а Spring должна создать прокси-сервер, то он будет работать везде, где он вызывается для автосохраненного компонента для вашего класса, но если вы попытаетесь вызвать его на экземпляр, который вы создали вручную или из самого класса, он будет тихо не запускается внутри транзакции.

+0

Достаточно ли добавлять AspectJ в pom.xml? –

+1

Вы активируете функцию '@ Transactional', используя либо' @ EnableTransactionManagement', либо для вашей пружинной конфигурации. Для справки проверьте официальную документацию http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#tx-decl-explained –

+0

'@ EnableTransactionManagement' где? –