Spring @Transactional不适用于mysql函数调用

问题描述 投票:0回答:1

我的项目中有一个现有的代码,它调用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注释调用上面的方法,但是这个调用自动提交函数结果。

我无法撤消任何错误

java mysql spring entitymanager javax
1个回答
1
投票

您必须从另一个bean调用@Transactional方法,该方法必须是公共的。见Spring docs

在代理模式(默认设置)下,只拦截通过代理进入的外部方法调用。这意味着实际上,自调用目标对象中的一个方法调用目标对象的另一个方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务。此外,必须完全初始化代理以提供预期的行为,因此您不应该在初始化代码中依赖此功能,即@PostConstruct。

您可以使用AspectJ而不是默认代理模式来解决它。

© www.soinside.com 2019 - 2024. All rights reserved.