是的, 在同一个事务内,先保存后查询可以查询到刚刚保存的数据。

例如:

java
@Transactional
public void process() {

  // 保存数据
  userRepository.save(user);
  
  // 查询刚才保存的数据
  User u = userRepository.findByUserId(user.getId());

}

事务的原子性并不意味着事务内的操作只有在整个事务完成后才能看到效果。

事务的原子性是指一个事务里的所有操作要么全部成功,要么全部失败,它不可能只执行其中的一部分操作。但这并不意味着事务内的操作之间是独立的,无法看到对方的执行结果。事务提交前,各个操作对数据库的 change 是可见的,只是还没有最终提交。

查询可以看到未提交的变化。所以在一个事务内:

- 保存数据后,可以立即查询到刚保存的数据,不需要等整个事务结束。

- 这保证了事务内各操作之间的数据一致性。- 要真正提交到数据库还需等整个事务成功结束。

- 如果事务失败,对数据库的未提交 change 会通过回滚而取消。

综上,事务的原子性是保证所有操作同时成功或失败,而不是隔离操作。所以一个事务中的查询可以看到同事务的未提交更新。这也是保持Isolation的需要。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐