休眠的会话线程安全吗?

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

我的问题是,当我按顺序从两个线程触发更新时,该值已正确更新,但是当我几乎完全触发更新时,它将失败。

例如。表的当前阶段。

  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,这是正确的。

但是当我尝试在线程环境中运行相同的代码时,它给出了不好的结果。


答案 1

它不打算使实现器是线程安全的。相反,每个线程/事务都应该从SessionFactory获取自己的实例。

即使考虑到这一点,你的行为可能仍然不是你所期望的,因为交易会发挥作用。您必须设置适当的事务隔离级别。请参阅配置指南属性。hibernate.connection.isolation


答案 2

休眠会话和线程不混合。

您不应同时使用来自多个线程的会话,我建议您仅使用来自单个线程的会话。数据库会话实现甚至不需要是安全的。

您还必须考虑当您开始在多个线程中执行操作时事务会发生什么情况。事务绑定到当前线程。这很快就会变得令人振奋,并且您进入了实施者尚未测试其产品的区域。

最终,生命太短,无法迷失在沼泽中。


推荐