2016-03-13 3 views
1

Я построил инфраструктуру NHibernate для использования приложений Web и Desktop.Нужно ли устанавливать FlushMode.Commit при использовании ITransactions?

Однако, я хотел бы знать, нужно ли использовать FlushMode.Commit всякий раз, когда используются транзакции.

Было бы проблемой, если у меня есть по умолчанию FlushMode.Auto при получении или создании ISession?

Я прочел следующее: «Установите режим сброса сеанса на Commit, чтобы избежать ненужных отключений в базе данных при использовании транзакций».

Однако, я хотел бы, чтобы кто-то заверил меня, что, насколько функционально, FlushMode.Auto также выполняет эту работу.

Это просто проблема с производительностью, чтобы избежать ненужных поездок в базу данных?

Я мог бы жить с этим.

Пожалуйста, дайте мне свой свет!

ответ

1

TL; DR

Нет, не нужно, чтобы изменить режим промывки. Оставьте это как Auto, если не уверены. Вы избежите ошибок.

Полное объяснение

Режим по умолчанию вровень Auto работает, как описано here:

время от времени ISession будет выполнять операторы SQL, необходимые синхронизировать состояние соединений ADO.NET с государством из объектов, хранящихся в памяти. Этот процесс, на одном уровне, происходит по умолчанию в следующих моментов

  • от некоторых призываний Find() или Enumerable()
  • из NHibernate.ITransaction.Commit()
  • из ISession.Flush()

Эта логика делается для обеспечения того, чтобы запрашивая БД не будет возвращать устаревшие данные, в отношении того, что было сделано в текущей транзакции.

исключением случаев, когда вы в явной форме Flush(), нет абсолютно никаких гарантий о том, когда сессия выполняет ADO.NET звонки, только порядок, в котором они выполняются. Однако NHibernate гарантирует, что методы ISession.CreateQuery (..) никогда не возвратят устаревшие данные; ни будут ли они возвращать неверные данные.

Изменение режима флеша по умолчанию может привести к тому, что ваши запросы внутри транзакции возвратят данные, не учитывающие то, что было сделано ранее в одной транзакции.

Если вы не уверены, что не будете укушены какой-либо ошибкой из-за устаревших данных, возвращаемых последующими запросами в той же транзакции, лучше оставить режим очистки как Auto.

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

Лично я считаю, что не стоит менять режим флеша по умолчанию в надежде сократить круглые поездки SQL. Особенно, если вы не проверяете, что это делает это значительно или незначительно в случае вашего заявления.

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