我努力了解为什么在尝试使用一种@Scheduled
方法时为什么未提交我的更新。
这是我的情况的简化:
@Service
public class UserService {
@Transactional
public void updateUser(User user){
user.setName("Doe");
}
}
从两个位置调用此服务:
@RestController
@RequestMapping(value = "/users")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private UserRepository userRepository;
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public void getAvailableIssuers(@PathVariable("id") String id){
User user = userRepository.findOne(id);
userService.updateUser(user);
}
}
以及使用@Scheduled
方法的服务:
@Component
class InternalService {
@Autowired
private UserService userService;
@Autowired
private UserRepository userRepository;
@Scheduled(fixedRate=1000)
public void updateUser(){
User user = userRepository.findOne(1L);
userService.updateUser(user);
}
}
我的问题是,当我尝试通过InternalService
用户更新用户时,用户永远不会得到更新-但通过RestController可以很好地进行更新。当我@Transactional
为计划的方法添加注释时(即使使用readOnly = true),它也会起作用。
我从春季开始阅读有关交易的文档,但我仍然不明白为什么它不起作用。我检查了调试器,并且userService是Spring Proxy的形式。
有人可以帮我解释一下吗?
问题在于您的操作不限于该服务方法:在两种情况下,您都是从调用方法中的存储库中检索对象。您的交易必须涵盖数据库操作的整个集合。
至于为什么您的控制器实际上在工作,我不能仅凭此信息确定确切的信息,但我猜您正在使用OpenEntityManagerInView
并免费获得事务性边界。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句