CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
ORM 与数据库设计/课时/ORM 与事务
RawBlame
课时目录12 节

ORM 与数据库设计

  1. 01ORM 是什么
  2. 02范式与规范化
  3. 03ER 模型
  4. 04JPA 与 Hibernate
  5. 05MyBatis
  6. 06Spring Data 家族
  7. 07Schema 迁移
  8. 08N+1 与抓取策略
  9. 09MariaDB 与 MySQL
  10. 10ORM 与事务
  11. 11反模式
  12. 12综合练习

ORM 与事务

持久化上下文、sb-transaction 衔接。

25 分钟

ORM 与事务

ORM 的 持久化上下文 与数据库 事务 生命周期绑定:同一 @Transactional 内,Entity 修改会在 flush 时变成 SQL;异常则整批回滚。

学习目标

  • 理解持久化上下文与 Session 直觉
  • 在 Service 层配合 @Transactional 使用 JPA/MyBatis
  • 衔接 sb-transaction

典型业务:发布课程

@Service
public class TrackPublishService {

    private final TrackRepository trackRepository;
    private final LessonRepository lessonRepository;

    @Transactional
    public void publishTrack(Long trackId) {
        Track track = trackRepository.findById(trackId).orElseThrow();
        track.setStatus("published");  // 脏检查,flush 时 UPDATE

        lessonRepository.findByTrackIdAndStatus(trackId, "draft")
            .forEach(l -> l.setStatus("published"));

        // 任一步抛 RuntimeException → 全部回滚
    }
}

MyBatis 同理:同一 @Transactional 内多次 update 共享一个 JDBC 连接。

持久化上下文(JPA)

@Transactional 开始
  → EntityManager 打开持久化上下文
  → find() 返回 managed 对象
  → 改字段 → 事务提交前 flush → SQL
@Transactional 结束
  → 上下文关闭,对象 detached

坑:事务外改 detached 对象不会自动写库,需 merge() 或在新事务内重新加载。

只读与传播(常用)

@Transactional(readOnly = true)
public TrackDetailDto getTrackDetail(String slug) { ... }

只读事务可优化连接、避免无意 flush。传播行为默认 REQUIRED 即可,详见 sb-transaction。

ORM 特有事务坑

坑说明
懒加载事务外访问LazyInitializationException
长事务持久化上下文堆积,占内存
自调用同类方法互调不走代理,事务失效
批量 flush大量 insert 需 saveAll + 分批或 JDBC batch

SQL 层 ACID 复习:sql-transaction、pg-transactions。

相关课程

  • sb-transaction
  • orm-jpa
  • orm-mybatis
  • 练习

    • 写一个没有 @Transactional 的 publishTrack,观察部分更新是否可能
    • 解释为何 Controller 不宜加 @Transactional
    • 删除 track 时 ON DELETE CASCADE 与 Java 级联 @OneToMany(cascade=REMOVE) 如何配合

    小结

    事务划边界,ORM 在边界内跟踪对象变更。 下一课列举 ORM 反模式。

    加载本节练习…
    ← 上一课MariaDB 与 MySQL下一课 →反模式