在我的测试用例中,我有事务方法来创建用户,然后在不同的线程中调用异步方法,从数据库中检索该用户。在下面的代码中,在 db 中找不到用户,dao 返回 null。如何确保不同线程都有数据?看来冲水并没有什么帮助。我需要手动提交吗?将隔离级别设置为 READ_UNCOMMITED 也没有帮助。
@Transactional public void createUser() { User user = new User(); user.setLogin("test"); userService.save(user); userService.flush(); logger.debug("New user id {}", user.getId()); //id=1 transactionalService.getUser(user.getId()); }
事务服务
@Async @Transactional public void getUser(Long id) { User user = userDao.getById(id); assertNotNull(user); }
最佳答案
整个事务方法完成后提交事务。创建用户事务如果在主事务中则无法提交。将以前的代码更改为类似这样的代码即可。
@Transactional public void createUser() { User user = transactionalService.createUser(); transactionalService.getUser(user.getId()); }
和事务服务
@Transactional(propagation=Propagation.REQUIRES_NEW) public void createUser() { User user = new User(); user.setLogin("test"); userService.save(user); logger.debug("New user id {}", user.getId()); //id=1 return user } @Async @Transactional public void getUser(Long id) { User user = userDao.getById(id); assertNotNull(user); }
关于java - Spring JPA @Transactional - 数据在不同线程中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929796/