Spring @Transactional仅在调用方也是@Transactional时有效

姆卢潘

我努力了解为什么在尝试使用一种@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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring @Transactional仅在调用方也是@Transactional时有效

来自分类Dev

Spring @Transactional批注:自我调用

来自分类Dev

Spring @Transactional + jdbcTemplate调用Web服务

来自分类Dev

图像RotateFlip仅在直接调用时有效

来自分类Dev

jQuery Ajax调用仅在首页加载时有效

来自分类Dev

图像RotateFlip仅在直接调用时有效

来自分类Dev

带有@Transactional批注的Spring OpenSessionInViewFilter

来自分类Dev

@Transactional Spring没有创建新的交易

来自分类Dev

Spring数据JPA @Transactional

来自分类Dev

Spring @Transactional 隔离传播

来自分类Dev

调用save后获取null id,只有在spring boot项目中使用@transactional后

来自分类Dev

拖放:仅在刷新时有效

来自分类Dev

提取仅在刷新时有效

来自分类Dev

仅在调试javascript时有效

来自分类Dev

从调用非事务性方法的@Transactional方法在Spring 4.3

来自分类Dev

如果使用@Transactional注解,则Spring方法不会被调用

来自分类Dev

JavaScript在使用Node调用时有效,但仅在从HTML调用时才有效

来自分类Dev

JavaCompiler 在直接运行 main 方法时有效,但在运行 spring-boot:run 时无效

来自分类Dev

spring @transactional线程安全吗?

来自分类Dev

在类与方法上的Spring @Transactional

来自分类Dev

Spring @Transactional未提交记录

来自分类Dev

Spring @Transactional如何“停止”交易

来自分类Dev

Spring @Transactional注释的行为很奇怪

来自分类Dev

Spring @Transactional无法正常工作

来自分类Dev

Spring Singleton @Transactional并发访问

来自分类Dev

Spring @Transactional如何“停止”交易

来自分类Dev

Spring @Transactional方法和类

来自分类Dev

Spring 无法识别 @Transactional 注释

来自分类Dev

Spring boot @Transactional 不回滚

Related 相关文章

热门标签

归档