Hibernate многопользовательская среда - PullRequest
0 голосов
/ 21 января 2010

Рассмотрим ситуацию, когда пользователь 1 запрашивает базу данных через приложение, используя hibernate (получить или загрузить или от клиента, где name = "gkp"), он получает данные. После этого администратор базы данных вручную обновляет эту конкретную строку, выполняя запрос на обновление в db.Если второй пользователь выполнит тот же запрос, получит ли он обновленные данные или старые (которые видит пользователь 1).

Будет ли Hibernate сохранять результаты в сеансе и передавать их второму пользователю. Что происходит на самом деле?

1 Ответ

3 голосов
/ 21 января 2010

Второй пользователь получит объект, содержащий старые данные, если у вас включено кэширование второго уровня, и объект, содержащий новые данные, если нет. Если, конечно, они не используют один и тот же экземпляр ISession, что не рекомендуется.

Кэширование первого уровня находится на уровне сеанса; Второй уровень находится на уровне фабрики сессий. Если у вас есть обновления, которые сделаны напрямую, а не через NHibernate, они не будут восприняты ни одним из уровней кэширования, поэтому, если вы попадаете в кэш (либо с включенными различными сеансами и кэшированием второго уровня, либо с использованием того же сеанс) вы не увидите внесенные изменения.

В этих сценариях часто имеет смысл использовать какой-либо столбец версии (например, отметку времени SQL Server, Oracle ORA_SCN) и оптимистичную автономную блокировку, чтобы предотвратить обновление объекта, который фактически был обновлен другим процессом. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...