繁体   English   中英

共享会话实体

[英]Sharing session entities

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

Student student = session.load(1); // 1 is the id of some student

然后一个用户操作年龄字段,例如:student.setAge(12); 第二个用户是否完全在另一笔交易中看到该更改? 我的意思是,如果第二个用户在自己的事务中调用了student.getAge(),他会看到新值-12吗? 请注意,更改age属性的第一个用户尚未提交交易。

那只是部分休眠的问题。 其他用户是否看到未提交的数据取决于您是否已将数据库连接的隔离级别更改为“未提交”。 您没有太多正当的理由要这样做,并且休眠状态会将其默认为已提交读操作,除非被覆盖。 因此,总的来说,没有,其他用户在提交事务之前不会看到更改。

如果您降低了隔离级别,那么它取决于SQL实际发送到数据库的时间。 这是基于休眠的刷新设置,在多层系统中可能很难预测。 但是基本上调用setAge不会将SQL发送到其他人可以看到的数据库。 导致刷新的事情必须发生,这些事情又取决于配置。

还要注意,如果第二个会话在提交更新之前加载了一个实体,即使第一个会话提交了更新,该第二个会话也不会自动魔术地更新其内存中实体,除非您显式调用刷新对象。 例如,

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擅长在多个线程中同时更新。

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

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

参见http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM