一尘不染

Hibernate的会话线程安全吗?

hibernate

我需要知道,hibernate的会话是否是线程安全的。但是很明显,新会话将附加到每个线程以执行。但是我的问题是,如果在一个线程中我已经更新了某个实体的某个值,那么这将在同一时间执行期间反映在另一个线程中吗?

我的问题是,当我依次从两个线程启动更新时,值会正确更新,但是当我几乎完全启动更新时,它将失败。

例如 表的当前阶段。

  ID      NAME      MARKS
------- --------- --------
  1       John       54

我正在尝试以下:

Student student = session.load(Student.class, 1);
student.setMarks(student.getMarks() + 1);
session.update(student);
session.close();

当我尝试在循环中运行上述代码(例如10)时,表“ student”中“ marks”的值将正确更新,即该值将更新为64,这是正确的。

但是,当我尝试在线程环境中运行相同的代码时,会产生不好的结果。


阅读 209

收藏
2020-06-20

共1个答案

一尘不染

并不意味着实现者是线程安全的。相反,每个线程/事务都应从SessionFactory获取其自己的实例。

即使考虑到这一点,您的行为仍可能不是您所期望的,因为交易开始起作用。您将必须设置适当的事务隔离级别。请参阅配置指南hibernate.connection.isolation财产。

2020-06-20