是的, 在同一个事务内,先保存后查询可以查询到刚刚保存的数据。
例如:
java
@Transactional
public void process() {
// 保存数据
userRepository.save(user);
// 查询刚才保存的数据
User u = userRepository.findByUserId(user.getId());
}
事务的原子性并不意味着事务内的操作只有在整个事务完成后才能看到效果。
事务的原子性是指一个事务里的所有操作要么全部成功,要么全部失败,它不可能只执行其中的一部分操作。但这并不意味着事务内的操作之间是独立的,无法看到对方的执行结果。事务提交前,各个操作对数据库的 change 是可见的,只是还没有最终提交。
查询可以看到未提交的变化。所以在一个事务内:
- 保存数据后,可以立即查询到刚保存的数据,不需要等整个事务结束。
- 这保证了事务内各操作之间的数据一致性。- 要真正提交到数据库还需等整个事务成功结束。
- 如果事务失败,对数据库的未提交 change 会通过回滚而取消。
综上,事务的原子性是保证所有操作同时成功或失败,而不是隔离操作。所以一个事务中的查询可以看到同事务的未提交更新。这也是保持Isolation的需要。
在同一个事务中,保存数据后可以立即查询到新数据,这是因为事务的原子性确保了操作的可见性,但实际提交还需等待事务结束。如果事务失败,未提交的变更会被回滚,以维护数据一致性。
174万+

被折叠的 条评论
为什么被折叠?



