2013-03-01 4 views
1

Предположим, у нас есть веб-приложение, использующее Hibernate. Мой вопрос о том, что произойдет, если два разных перехода от разных пользователей, доступ и управление одним и тем же объектом? Например, у нас есть объект с именем «Студент», и у него есть поле «возраст». Теперь две разные транзакции от различных пользователей, получать эту сущность с помощью Hibernate сеанса: напримерСовместное использование объектов сеанса

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

, а затем один пользователь манипулируют возрастные поля например: student.setAge (12); Видит ли второй пользователь это изменение в полностью другой транзакции? Я имею в виду, если второй пользователь вызывает в своей транзакции student.getAge(), ли он видит новое значение - 12? Обратите внимание, что первый пользователь, который изменил возрастную категорию, еще не совершил транзакцию.

+0

Обеспечить полную программу, чтобы получить четкое представление. Как правило, в веб-приложении две разные транзакции будут использовать два разных объекта объекта «Студент». –

ответ

1

Это только частично спящий вопрос. Независимо от того, видят ли другие пользователи незафиксированные данные, зависит от того, изменили ли вы уровень изоляции ваших соединений с базой данных на read-uncommitted. Существует не так уж много веских причин, которые вы когда-либо хотели бы сделать, и спящий режим будет по умолчанию использоваться для чтения, если не будет переопределено. Так что вообще, нет, другие пользователи не будут видеть изменений до тех пор, пока транзакция не будет совершена.

В случае, если вы снизили уровень изоляции, тогда все сводится к тому, что 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 
+0

Спасибо Affe за подробный ответ. Это то, что я хочу прочитать. – friko

+0

Я понял это ясно, спасибо снова. – friko

0

См. здесь: Hibernate session thread safety. Я думаю, что это очень похоже на то, о чем вы просите. В принципе, не рекомендуется использовать сеанс в нескольких потоках. Таким образом, если вы используете разные сеансы, второй пользователь не увидит изменений.

+0

Спасибо за быстрый ответ. – friko

0

Hibernate подходит для одновременного обновления в нескольких потоках в этом случае.

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

Во-вторых, механизм оптимальной блокировки будет работать, когда несколько транзакций будут обновлять одну и ту же запись. в первую очередь это первая модель. первая транзакционная транзакция завершается, вторая отправленная транзакция не будет выдавать исключение. потому что hibernate будет проверять свойство versin, чтобы проверить, не является ли версия исходной версией до того, как будет завершена операция обновления.

см http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html

Смежные вопросы