gpt4 book ai didi

java - Spring @Transactional 只有在调用者也是@Transactional 时才有效

转载 作者:行者123 更新时间:2023-11-30 10:47:12 24 4
gpt4 key购买 nike

我正在努力理解为什么当我尝试使用 @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),它也能正常工作。

我阅读了 spring 中关于事务的文档,但我仍然不明白为什么它不起作用。我检查了调试器,userService 是 Spring 代理的形式。

谁能帮我解释一下?

最佳答案

问题在于您的操作不受该服务方法的限制:在这两种情况下,您都是在调用方法中从存储库中检索对象。您的事务必须涵盖整个数据库操作集合。

至于为什么你的 Controller 实际上正在工作,我不能仅凭这些信息确定,但我猜你正在使用 OpenEntityManagerInView 并获得免费的交易边界。

关于java - Spring @Transactional 只有在调用者也是@Transactional 时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36237344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com