首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪里处理StaleObjectStateException

在哪里处理StaleObjectStateException
EN

Stack Overflow用户
提问于 2012-02-24 21:36:15
回答 2查看 1.3K关注 0票数 1

我应该使用try-catch块(旨在捕获/处理StaleObjectStateException)将对存储库的调用包装在ASP.NET MVC应用程序的相应控制器中,还是应该在存储库实现中进行?

另外,我如何处理异常,通知用户。据我所知,没有回滚的意图?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-25 02:41:05

问题归结为一个不同的问题:在哪里以及如何处理实体的并发修改?也就是说:用户A和用户B编辑相同的记录,当稍后保存该记录的用户(用户B)获得StaleObjectStateException时,因为他编辑的版本现在已过期。

以下是一些想法:

  1. 通过暴力强制将用户B的版本强制设置为“正确”版本,例如,从数据库中检索记录的当前版本,并将用户B的版本的整个状态应用于该版本。如果用户A更改了"E-Mail address“字段,而用户B更改了"User name”字段,则这是有问题的。使用这种方法,用户A所做的一切都会消失。在这种方法中,您将捕获StaleObjectStateException并修复repository.
  2. The“智能”方法中的所有内容:与方法1类似,所有内容都固定在存储库中(即。它完全捕获和处理StaleObjectStateException ),但它使用领域知识来选择性地仅应用用户B所做的一些更改。例如,如果用户A更改了电子邮件地址,而用户B更改了用户名,则这些更改不会互相排除,因此存储库只能更新电子邮件地址。如果同时更改了记录的两个方面,并且这两个方面并不直接相互依赖,则可以很好地工作。实现此解决方案可能相当复杂,这取决于您希望的“智能”程度。
  3. 拒绝在存储库中进行并发更改。在这种情况下,如果发生StaleObjectStateException,存储库需要报告它无法保存记录。它实际上可以让异常冒泡起来,但然后你会将NHibernate泄漏到控制器。相反,您可以抛出自己的异常,其中包含对您的域有意义的更有用的细节。在这种情况下,控制器是捕获异常的好地方。然后,您可以选择不同的操作方式,例如:

代码语言:javascript
复制
- Inform the user that the record couldn't be saved due to concurrent changes by another user and throw all changes away, forcing him to do everything from scratch.  This is of course painful for the user and should only be done if this really occurs rarely.
- Inform the user about the issue and let him decide what to do, e.g. force his changes or start over.

虽然这超出了你的问题,但我希望这仍然对你有帮助。

票数 3
EN

Stack Overflow用户

发布于 2012-02-24 22:40:35

如果您正确使用DI,那么将这种异常管理放在控制器中将打破您的关注点分离。

控制器属于表示层,表示层并不知道您正在使用什么来存储数据,而StaleObjectStateException是NHibernate之类的东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9431656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档