java - 单个 hibernate session 中的多个事务(使用 Spring)

是否可以使用 Hibernate + Spring 对以下内容进行建模。

  • 开场
  • 开始交易
  • 做一些工作
  • 提交
  • 开始交易
  • 更多工作
  • 提交
  • 关闭 session

我使用 Spring TransactionTemplate,它同时执行 session + 事务生命周期范围。

原因是有时我在业务流程中有几个阶段,我想在每个阶段完成后提交。但是我想继续使用相同的持久对象。如果我每个事务都有一个单独的 session ,那么我会收到暂时/分离的异常,因为原始 session 已关闭。

这可能吗?

最佳答案

是的,Hibernate 的 session 可以开始并提交多个事务。您需要做的是将打开的 session 存储在某处,然后重用它。请注意,Session 不是线程安全的对象,但如果您确定它不会有并发问题,您只需使用 TransactionSynchronizationUtils 将 session 绑定(bind)到线程资源然后在需要的时候解绑,你可以找到一个例子here或者您可以查看 OSIV 及其标准实现。

这是一个非常复杂的事情,它会容易得多,因此最好立即关闭 session 并且不要重复使用它,因为它可能会带来麻烦:

  • 缓存内的对象不会被自动驱逐,因此您的 Session 会不断增长,直到 OutOfMemory。
  • session 内部的对象不会被刷新,除非它们是脏的,因此对象被另一个用户更改的机会越来越大。确保只有一个用户会更改可写对象。
  • 如果在某个步骤中发生异常,您必须确保关闭 session 。 Session 内部发生异常后,该对象不可重用。
  • 如果事务回滚,则 Spring 会清除 session ,因此您的所有对象都将分离。如果至少有一个事务被回滚,请确保丢弃所有内容。

关于java - 单个 hibernate session 中的多个事务(使用 Spring),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531122/

相关文章:

spring - jar 如何在使用它的 Web 应用程序中传播漏洞?

spring - 如何在运行时将新用户添加到 Spring Security

java - Spring WS : How to get and save XSD validat

java - 使用spring boot(安全)和keycloak启用角色身份验证?

java - Spring 验证与 Hibernate 验证

java - 使用具有不同 AuthenticationProviders 的多个 WebSecur

java - Spring Security 3 - 总是返回错误 302

java - 在 Spring Hibernate java 项目中使用 "Envers"审计表

java - Spring Integration Kafka Consumer Listener

spring - Spring JUnit 测试中的自动模拟实例化