Мой коллега и я обсуждали, когда (если?) Коллекция, кэшированная в кэше второго уровня, может вернуть устаревшие данные (мы используем ehcache и hibernate 3.2.4).
Вот сценарий:
- родительский объект P кэшируется и является сущностью.
- Родитель имеет коллекцию (сумку) детей, которые кешируются и ленився.
- Дочерние объекты C кэшируются и являются сущностями.
- Мы используем нестрогое чтение-запись в качестве нашей стратегии параллелизма в кэше для всех из них.
- Наша фабрика сессий имеет область действия, и задействована только 1 JVM.
- Предположим, что области кэша для всех вышеперечисленных кэшей достаточно велики, чтобы легко хранить в памяти все экземпляры всех детей и родителей.
В момент времени T1: загрузите родительский P и дочерние элементы C1 ... CN, выполнив session.load (p) и выполнив итерацию по дочерней коллекции, чтобы загрузить все C1 ... CN.
В момент времени T2: другой сеанс загружает C1 и обновляет C1, изменяя некоторые из его данных.
При каких обстоятельствах я могу вызвать P.getChildren (). Get (0), и будет возвращена устаревшая версия C1 (версия C1, загруженная в момент времени T1)?
Я думаю, что есть два:
- Если я нахожусь в том же сеансе гибернации, что и операции в T1 (в этом случае возвращается кэшированная версия сеанса)
- При нестрогом режиме чтения с чтением было бы возможно иметь состояние гонки, при котором обновление в момент времени T2 и загрузка происходят почти одновременно, и загрузка выигрывает гонку и извлекает устаревший объект из кэша. (В этом случае я могу перейти на чтение-запись, и все будет в порядке)