В моем проекте есть существующий код, который вызывает функцию 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
но этот вызов автоматически фиксирует результат функции.
Я не могу отменить какую-либо ошибку
Вы должны вызвать метод @Transactional
из другого компонента, и этот метод должен быть общедоступным. См. Документацию Spring:
В режиме прокси (по умолчанию) только внешние вызовы методов, поступающие через прокси-сервер, перехватываются. Это означает, что самоисключение, по сути, метод в целевом объекте, вызывающий другой метод целевого объекта, не приведет к фактической транзакции во время выполнения, даже если вызываемый метод отмечен @Transactional. Кроме того, прокси-сервер должен быть полностью инициализирован для обеспечения ожидаемого поведения, поэтому вам не следует полагаться на эту функцию в вашем коде инициализации, то есть @PostConstruct.
Вы можете обойти его, используя AspectJ вместо режима прокси-сервера по умолчанию.
TransactionAspectSupport.invokeWithinTransaction()
где-то выше в стеке вызовов. Если метод не существует, или это transactionManagerBeanName
свойство не является правильным, ваш контекст Spring не настроен правильно. Вы также можете проверить, что у вас есть только один TransactionManager, настроенный для контекста.