2012-06-21 2 views
0

Я имею дело с проблемами параллелизма в nhibernate, и я не уверен, что я прав. Я использую поле версии и когда транзакция завершается, я думаю, что StaleObjectStateException будет выбрано, если поле версии было изменено другим процессом. Я поймаю это исключение и обработаю этот случай, и он, похоже, работает.NHibernate: должны ли проблемы с параллелизмом вызывать ошибки в log4net?

Но мне интересно, что каждый раз, когда исключение выбрасывается, NHibernate создает ERROR в моем log4net-Logfile. Я установил loglevel для NHibernate в ERROR, потому что я думаю, что если возникнет ошибка, которая должна меня заинтересовать. Но меня не интересуют все сообщения о конфликте параллелизма, потому что я не считаю это ОШИБКОЙ.

Возможно, что я делаю что-то совершенно неправильное? Это правильный способ борьбы с параллелизмом, вылавливая исключение?

обновление: это то, что NHibernate ставит в моем логфайл:

2012-06-21 16:47:30,546 ERROR NHibernate.Event.Default.AbstractFlushingEventListener: Could not synchronize database state with session 
NHibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Delta.FollowUp.Model.CFollowUp#60003] 
    bei NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 2780. 
    bei NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 2692. 
    bei NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 3000. 
    bei NHibernate.Action.EntityUpdateAction.Execute() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityUpdateAction.cs:Zeile 79. 
    bei NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 136. 
    bei NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 126. 
    bei NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 170. 
    bei NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:Zeile 241. 

ответ

1

Если вы не хотите хотите регистрировать ошибки NHibernate, просто удалите регистратор для NHibernate, установите его на уровне FATAL или каким-то образом отфильтруйте исключения.

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

1

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

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

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