0

我正在处理 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 会话)。
4

2 回答 2

1

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

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

于 2012-06-21T17:19:20.963 回答
1

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

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

于 2012-06-22T00:02:04.877 回答