知识卡片

声明式事务绑定会话生命周期

专业/工作 · 228.a

内容

[[延迟加载与会话边界的矛盾]]提到,延迟加载的关联对象必须在会话仍然打开时被访问,否则 会报错;声明式事务标注(如@Transactional)恰好是解决这个矛盾的工程手段——它在方法开 始执行时把一个会话绑定到当前线程,方法体内所有代码(包括各处触发的延迟加载)共享同一 个会话,直到方法正常返回或抛异常,才统一提交或回滚并释放会话。如果不用这种绑定,框架 会为每次持久化操作都各自开一个新会话,之前查询取到的对象上任何未加载的关联就再也无法 访问。发散:这揭示了一个通用规律——”资源生命周期”和”业务操作边界”必须被显式对齐,声 明式事务不是在管理数据库提交,而是在管理一个更根本的东西:把资源的生命周期绑定到一个 清晰的调用范围上,避免它被悄悄地拆分或提前结束。

参考来源

《精通Hibernate》第13章《如何激活事务标注》