Spring @Transactional не работает для вызова функции mysql

0

В моем проекте есть существующий код, который вызывает функцию mysql. Функция mysql обновляет значение в таблице.

function next_val (input varchar(10))
returns decimal(5,0)
begin
     update table set val = (@next_val := next_val) + inc where name = input;
     return @next_val;
end

В коде Spring я вызываю функцию с помощью javax.entitymanager

em.createNativeQuery("select next_val('DB') from dual");

Я @transactional вышеупомянутый метод, используя аннотацию @transactional но этот вызов автоматически фиксирует результат функции.

Я не могу отменить какую-либо ошибку

  • 0
    У вас есть менеджер транзакций JPA, настроенный для вашего контекста Spring? Откуда вы вызываете транзакционный метод (из какого-то другого метода того же компонента)?
  • 0
    @ Ян Халаша Да. Диспетчер транзакций JPA настроен. Это вызывается из другого метода того же бина
Показать ещё 1 комментарий
Теги:
spring
entitymanager
javax

1 ответ

1

Вы должны вызвать метод @Transactional из другого компонента, и этот метод должен быть общедоступным. См. Документацию Spring:

В режиме прокси (по умолчанию) только внешние вызовы методов, поступающие через прокси-сервер, перехватываются. Это означает, что самоисключение, по сути, метод в целевом объекте, вызывающий другой метод целевого объекта, не приведет к фактической транзакции во время выполнения, даже если вызываемый метод отмечен @Transactional. Кроме того, прокси-сервер должен быть полностью инициализирован для обеспечения ожидаемого поведения, поэтому вам не следует полагаться на эту функцию в вашем коде инициализации, то есть @PostConstruct.

Вы можете обойти его, используя AspectJ вместо режима прокси-сервера по умолчанию.

  • 0
    Сейчас я звоню из другого бина и имею открытый метод. Тем не менее транзакция фиксируется автоматически. Есть ли что-то делать с функцией?
  • 0
    Затем вы можете попытаться отладить транзакционный метод и установить там точку останова. Вы должны увидеть TransactionAspectSupport.invokeWithinTransaction() где-то выше в стеке вызовов. Если метод не существует, или это transactionManagerBeanName свойство не является правильным, ваш контекст Spring не настроен правильно. Вы также можете проверить, что у вас есть только один TransactionManager, настроенный для контекста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню