NHibernate:并发问题是否会导致log4net中的错误



我正在处理nhibernate中的并发问题,我不确定我是否做得对。我使用版本字段,当事务被提交时,我认为如果版本字段被另一个进程更改,则会抛出 StaleObjectStateException。我捕获此异常并处理该情况,它似乎有效。

但我想知道的是,每次抛出异常时,NHibernate都会在我的log4net-Logfile中产生一个错误。我已将NHibernate的日志级别设置为错误,因为我认为如果发生错误,我应该感兴趣。但我对有关某些并发冲突的所有消息都不感兴趣,因为我不认为这是一个错误。

所以可能是我做错了什么?通过捕获异常来处理并发性的正确方法吗?

更新:这是NHIBERNATE放在我的日志文件中的内容:

2012-06-21 16:47:30,546 错误 NHibernate.Event.Default.AbstractFlushingEventListener: 无法将数据库状态与会话同步NHibernate.StaleObjectStateException:行被另一个事务更新或删除(或未保存值映射不正确):[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\NHhibernate\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\NHhibernate\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\NHhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 3000.   bei NHibernate.Action.EntityUpdateAction.Execute() in d:\CSharp\NH\NHhibernate\src\NHibernate\Action\EntityUpdateAction.cs:Zeile 79.   bei NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in d:\CSharp\NH\NHhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 136.   bei NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d:\CSharp\NH\NHhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 126.   bei NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH\NHhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 170.   bei NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in d:\CSharp\NH\NHhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:Zeile 241.

如果您不想记录 NHibernate 错误,只需删除 NHibernate 的记录器,将其设置为致命级别,或以某种方式过滤异常。

您仍然可以捕获异常,处理它,重新抛出它,记录它,等等。

出现并发问题时执行的操作取决于应用。在很多情况下,捕获异常并重试工作单元就足够了 - 但定义工作单元是它变得棘手的地方。 根据您的情况,再次加载实体并再次进行更改然后保存可能就足够了,但这实际上取决于您的应用程序。

基本上,该异常意味着另一个线程/进程更改了数据库中的实体,因此您现在需要做出相应的反应。 NHibernate将其记录为错误,因为使用版本字段意味着乐观并发,您假设没有其他东西会更改您要更改的行,因此,如果某些内容确实更改了其中一行,那么您需要处理它。

最新更新