考虑用户1使用hibernate(获取或加载或来自客户,其中name =“gkp”)查询数据库应用程序的情况。他获取数据。此后,DBA通过在以下位置执行更新查询来手动更新该特定行。 db。如果第二个用户执行相同的查询,他将获得更新的数据或旧数据(用户1看到)。
hibernate会将结果存储在会话中并返回给第二个用户。实际会发生什么?
答案 0 :(得分:3)
如果启用了第二级缓存,第二个用户将获得包含旧数据的对象,如果没有,则第二个用户将获得包含新数据的对象。除非他们当然使用相同的ISession实例,这是不可取的。
第一级缓存是在会话级别;二级是在会议工厂级别。如果你有直接而不是通过NHibernate进行的更新,它们将无法通过任何级别的缓存获取,因此如果你正在访问缓存(打开不同的会话和二级缓存,或者通过使用相同的会议)你不会看到已经做出的改变。
在这些情况下,使用某种版本列(例如SQL Server时间戳,Oracle ORA_SCN)和乐观离线锁定通常是有意义的,以防止对另一个进程下实际已更新的实体进行更新