Спящий режим и транзакции и блокировка таблиц - PullRequest
13 голосов
/ 04 декабря 2010

Если у меня есть код, который выглядит следующим образом:

beginTransaction();
// lots of stuff happens, can take anywhere from a minute to several minutes.
// it will read from several tables via calling getter methods on lazy relationships.
commitTransaction();

Между началом и фиксацией считываются ли таблицы, которые считываются заблокированными, и впоследствии это вызовет проблемы в многопользовательском режимесреда, в которой возникают проблемы, когда другой пользователь вызывает тот же самый код, указанный выше?

Если вышеприведенное является проблематичным, следует ли нам всегда стараться делать транзакции короткими?и чтобы облегчить это, вместо того, чтобы вызывать методы getter для ленивых отношений, означает ли это, что лучше держать транзакции короткими и находить результаты вручную для детей родителей?

Ответы [ 2 ]

18 голосов
/ 04 декабря 2010

Hibernate не собирается ничего делать для явной блокировки таблиц, из которых вы читаете. Ответ на самом деле зависит от того, какую базу данных вы используете и какие уровни изоляции установлены. Блокировка всей таблицы путем чтения строк не должна происходить ни в одной полнофункциональной базе данных, написанной в этом столетии. Для любой многовариантной базы данных ничто не заблокируется, если вы сами не заблокируете строку.

Ваши транзакции должны быть любой длины, необходимой для вашей атомарной единицы работы. Там нет правильной или неправильной длины. Спросите себя: «Все ли здесь происходит успешно или неудачно, как единое целое, и все вместе откатывается, если какой-то один элемент не работает?» Это та область действия, для которой вы устанавливаете транзакцию.

Помните, вам не нужна транзакция для отложенной загрузки! Вам просто нужна открытая сессия. Два не связаны. Вы можете зафиксировать транзакцию и оставить сеанс открытым, чтобы ленивая загрузка работала.

4 голосов
/ 04 декабря 2010

Лучше всего, чтобы транзакции были короткими. Однако семантика блокировки зависит от уровня изоляции транзакции.

Open Session In View - это шаблон, который вы ищете, когда говорите о ленивом / отношениях.

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