论坛首页 Java企业应用论坛

最近在看Hibernate的缓存,有一点没搞清楚

浏览 12173 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-03  
session的一级缓存中的对象只有该session自己能取到,其他session是取不到的,所以不存在事务问题,实际所有操作都在一个事务中。

而sessionFactory的二级缓存是所有session共用的,所以要考虑事务问题,在一个session对数据进行操作时,需要保证对于其他session不管是查询数据库还是查询二级缓存取得的数据必须是一致的,即如果二级缓存中有缓存的数据,那么该数据和数据库中的数据是一致的。

因此如果一个session中对数据进行了修改,那么只有在它把事务提交后才会把数据更新到二级缓存中(如果是读写的)。
具体来说,如果在一个session中修改了一条数据,在它还没有写到数据库时,此时数据库和二级缓存中的数据仍然是一致的,它不会去改变二级缓存中的数据;在数据flush刷出,写到数据库中后,但还没有提交,此时如果有其他session要从数据库中读取该数据的话应该是等待该修改事务的提交,因此该修改数据的session会将二级缓存中的该id对应的数据对象失效掉(或者说锁定),不让其他session从二级缓存中取该数据,以保持和数据库的一致性;当session将事务提交后会将修改后的数据更新到二级缓存中。

对于没有修改的从数据库中读到的数据都会更新到二级缓存中(当然必须设定了该对象类使用二级缓存)。
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics