我的项目中有一个现有的代码,它调用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
注释调用上面的方法,但是这个调用自动提交函数结果。
我无法撤消任何错误
您必须从另一个bean调用@Transactional
方法,该方法必须是公共的。见Spring docs:
在代理模式(默认设置)下,只拦截通过代理进入的外部方法调用。这意味着实际上,自调用目标对象中的一个方法调用目标对象的另一个方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务。此外,必须完全初始化代理以提供预期的行为,因此您不应该在初始化代码中依赖此功能,即@PostConstruct。
您可以使用AspectJ而不是默认代理模式来解决它。