Подтвердить что ты не робот

Операции NHibernate по чтению

Я прочитал документацию и объяснение того, почему настоятельно рекомендуется использовать транзакции для операций чтения в NH. Тем не менее, я до сих пор не полностью "купил" его. Может ли кто-нибудь принять удар, объяснив это, просто не сообщив мне RTFM, что я уже сделал?;)

4b9b3361

Ответ 1

Этот пост от одного из авторов может иметь ваш ответ:

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

Оставляя в стороне проблему безопасности работа с транзакциями, предположение о том, что операции и мы должны их оптимизировать ложный. Как уже упоминалось, базы данных всегда работают в сделка. И базы данных были сильно оптимизирована для работы с сделки. Вопрос в том, что это за оператор или за пакет. Требуется некоторая работа для создания и транзакции, и необходимо сделать это за выражение на самом деле более дорогостоящее, чем делая это за каждую партию.

Ответ 2

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

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

Это, конечно, верно для ЛЮБОГО уровня доступа к данным, который неявно запускает транзакции для вас, если вы этого не делаете. Он не ограничивается NHibernate.

Ответ 3

var fooIdFromDb = ExecuteQuery("Select Id from Foo where something = somethingelse");
var barsFromDb = ExecuteQuery("Select * from Bar where FooId = " + fooIdFromDB);

Что делать, если какая-либо другая транзакция удаляет строки из строки между двумя запросами? У вас будут проблемы с данными phantom. Это не проблема конкретной NHibernate. У вас будет такая же проблема с любым другим видом доступа к базе данных без использования транзакций. Вы должны прочитать руководство о транзакциях вообще, а не в руководстве NHiberante.

Ответ 4

Позвольте сосредоточиться на том, что произойдет, если вы не будете использовать транзакции. Обычно, но не обязательно, вы закрываете сеанс в конце обработки, но перед тем, как начать чтение данных (т.е. View). Этот метод распространяется под термином " Открыть сеанс в представлении" (хотя он, очевидно, имеет шаблон для предотвращения чтения перед закрытием). Этот шаблон часто используется в веб-приложении, где сеанс открывается, когда запрос прибывает и закрывается непосредственно перед записью в поток ответов.

(N) Спящий режим требует сеанса и транзакции. Когда вы будете читать без использования явной транзакции, транзакция будет настроена для вас. Когда вы читаете после совершения транзакции, поведение зависит от конфигурации и драйвера NH.

Оба ODBC и JDBC не определяют, что происходит, когда соединение закрыто, а также незафиксированные или незашифрованные данные. Когда соединение будет снова открыто, возможно, что новая транзакция будет автоматически запущена.

Использование не транзакционного доступа может использоваться только совместно с установкой auto-commit явно в конфигурации NHibernate. Если нет, используется значение по умолчанию драйвера, и оно может работать или может не работать.

Короче говоря, есть много недостатков и поведения undefined, когда вы не используете транзакции при чтении. Он будет работать часто, но это зависит от конфигурации, применяемых шаблонов, драйверов. Там есть большой шанс получить LazyInitializationException s, что является общим результатом чтения после фиксации без открытия новой транзакции.

"Лучшая практика" - использовать одну транзакцию для чтения/записи и другую для чтения только для чтения. Это кратко описано в предыдущей ссылке, раздел "Могу ли я использовать две транзакции в сеансе", но требует больше вашей реализации.

Это не только "использование транзакций для чтения", но также: "используйте ту же транзакцию, которую вы используете для записи для чтения". (а затем, хотя это верно, фактическое приложение будет зависеть от ваших текущих шаблонов, количества уровней, кэширования и конфигурации).

Обновление: немного расширилось, удалены некоторые двусмысленности