我正在处理 nhibernate 中的并发问题,我不确定我是否做得对。我使用版本字段,当事务被提交时,如果版本字段被另一个进程更改,我认为会抛出 StaleObjectStateException。我抓住了这个异常并处理了这种情况,它似乎有效。
但我想知道的是,每次抛出异常时,NHibernate 都会在我的 log4net-Logfile 中产生一个错误。我已将 NHibernate 的日志级别设置为 ERROR,因为我认为如果发生错误,我应该会感兴趣。但是我对所有关于一些并发冲突的消息不感兴趣,因为我不认为这是一个错误。
所以可能是我做错了什么?通过捕获异常来处理并发是正确的方法吗?
更新:这是 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\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。 在 d:\CSharp\ 中北 NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 3000。 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityUpdateAction.cs:Zeile 中的北 NHibernate.Action.EntityUpdateAction.Execute() 79。 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 136 中的北 NHibernate.Engine.ActionQueue.Execute(IExecutable 可执行文件)。 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 126 中的北 NHibernate.Engine.ActionQueue.ExecuteActions(IList 列表)。 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 170 中的北 NHibernate.Engine.ActionQueue.ExecuteActions()。 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:Zeile 241 中的北 NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource 会话)。