Спящий режим и транзакции и блокировка стола

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

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 на ленивых отношениях, означает ли это, что лучше всего держать транзакции короткими и найти вручную для детей родителей?

Ответы

Ответ 1

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

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

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

Ответ 2

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

Открыть сеанс в представлении - это шаблон, который вы ищете, когда говорите о ленивом выборе/отношениях.