我有一个标有org.springframework.transaction.annotation.Transactional的方法
@Transactional
private void bob(String userName){
User user = userRepo.getUser(userName);//autowired repo finds User domain Object
user.setSomeDate(new Date());
}
然后我将此方法称为循环
for(String userName: userNames ){
System.outPrintln("something happens before we cal it again.");
bob(userName);
}
repo找到用户,并且没有记录任何异常。
我的理解是脏用户对象是一个托管实体,并在事务退出时保存。
我实际看到的是在重写事务方法bob时刷新用户。因此,如果for循环在执行后有3个用户名,我可以看到前2个用户在db中获取日期,第三个永远不会刷新到db并保持无日期。 所以我的理解似乎是错误的。我错过了什么?
答案 0 :(得分:1)
问题是你的方法是私有的,默认情况下Spring只能在从另一个类调用的公共方法中启动一个事务。你可以使用aspectJ来解决这个问题。
从春天docs
方法可见性和@Transactional
使用代理时,应该应用@Transactional注释 仅限具有公众可见度的方法。如果你做注释保护, 使用@Transactional注释的私有或包可见方法, 没有引发错误,但带注释的方法没有出现错误 配置的事务设置。考虑使用AspectJ(参见 如果你需要注释非公开方法。