Java 共享会话实体

Java 共享会话实体,java,hibernate,web,Java,Hibernate,Web,假设我们有一个使用Hibernate的web应用程序。 我的问题是,如果来自不同用户的两个不同的事务访问和操作同一个实体,会发生什么?例如,我们有一个名为“学生”的实体,它有一个字段“年龄”。现在,来自不同用户的两个不同事务,使用Hibernate会话获取该实体,例如: Student student = session.load(1); // 1 is the id of some student 然后一个用户操作年龄字段,例如: 学生背景(12); 第二个用户是否在另一个事务中看到了该更改

假设我们有一个使用Hibernate的web应用程序。 我的问题是,如果来自不同用户的两个不同的事务访问和操作同一个实体,会发生什么?例如,我们有一个名为“学生”的实体,它有一个字段“年龄”。现在,来自不同用户的两个不同事务,使用Hibernate会话获取该实体,例如:

Student student = session.load(1); // 1 is the id of some student
然后一个用户操作年龄字段,例如: 学生背景(12); 第二个用户是否在另一个事务中看到了该更改? 我的意思是如果第二个用户在自己的事务中调用 student.getAge(), 他看到新的值-12了吗?
请注意,更改age属性的第一个用户尚未提交事务。

这只是一个hibernate问题的一部分。其他用户是否看到未提交的数据取决于您是否已将数据库连接的隔离级别更改为“读取未提交”。没有太多您想要这样做的正当理由,hibernate将默认它为readcommitted,除非被重写。因此,一般来说,在提交事务之前,其他用户不会看到更改

如果您降低了隔离级别,那么问题就归结为SQL实际被发送到数据库的时间。这是基于hibernate的刷新设置,在多层系统中可能有点难以预测。但基本上,调用
setAge
不会向其他人可以看到的数据库发送SQL。必须发生一些导致刷新的情况,这些情况又取决于配置

进一步注意,如果第二个会话在提交更新之前加载了一个实体,即使第一个会话提交了更新,该第二个会话也不会自动神奇地更新其内存中的实体,除非您显式地对其调用refresh。e、 g

Time 1: Session A loads Student 1
Time 2: Session B loads Student 1
Time 3: Session A sets new age and commits
Time 4: Session B gets Age, will still see old value
Time 5: Session B calls refresh on Student 1
Time 6: Session B gets Age, will see new value set in Session A

这只是冬眠问题的一部分。其他用户是否看到未提交的数据取决于您是否已将数据库连接的隔离级别更改为“读取未提交”。没有太多您想要这样做的正当理由,hibernate将默认它为readcommitted,除非被重写。因此,一般来说,在提交事务之前,其他用户不会看到更改

如果您降低了隔离级别,那么问题就归结为SQL实际被发送到数据库的时间。这是基于hibernate的刷新设置,在多层系统中可能有点难以预测。但基本上,调用
setAge
不会向其他人可以看到的数据库发送SQL。必须发生一些导致刷新的情况,这些情况又取决于配置

进一步注意,如果第二个会话在提交更新之前加载了一个实体,即使第一个会话提交了更新,该第二个会话也不会自动神奇地更新其内存中的实体,除非您显式地对其调用refresh。e、 g

Time 1: Session A loads Student 1
Time 2: Session B loads Student 1
Time 3: Session A sets new age and commits
Time 4: Session B gets Age, will still see old value
Time 5: Session B calls refresh on Student 1
Time 6: Session B gets Age, will see new value set in Session A

请看这里:。我认为这与你的要求非常相似。基本上,在多个线程中使用会话不是一个好主意。因此,假设您正在使用不同的会话,第二个用户将看不到更改。

请查看此处:。我认为这与你的要求非常相似。基本上,在多个线程中使用会话不是一个好主意。因此,假设您使用的是不同的会话,第二个用户将看不到更改。

Hibernate擅长在多个线程中同时更新

首先,这种情况下不存在线程安全问题。因为每个事务都有自己的会话,所以每个会话将分别在其所谓的一级缓存中保存其加载的对象。两个线程中的两个实例不会看到对方

其次,当多个事务更新同一记录时,最优锁定机制将起作用。这是先到先得的服务模式。第一个提交的事务成功,第二个提交的事务将失败并引发异常。因为hibernate将在其更新操作提交之前检查version属性以查看版本是否为原始版本


如本例所示,Hibernate擅长在多线程中同时更新

首先,这种情况下不存在线程安全问题。因为每个事务都有自己的会话,所以每个会话将分别在其所谓的一级缓存中保存其加载的对象。两个线程中的两个实例不会看到对方

其次,当多个事务更新同一记录时,最优锁定机制将起作用。这是先到先得的服务模式。第一个提交的事务成功,第二个提交的事务将失败并引发异常。因为hibernate将在其更新操作提交之前检查version属性以查看版本是否为原始版本


请参见

提供完整的计划以获得清晰的想法。通常在一个web应用程序中,两个不同的事务将使用
Student
实体的两个不同对象。提供完整的程序以获得清晰的概念。通常在一个web应用程序中,两个不同的事务将使用
Student
实体的两个不同对象。感谢您提供详细的答案。这就是我想读的。谢谢你详细的回答。这就是我想读的。