gpt4 book ai didi

c# - 在哪里处理 StaleObjectStateException

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:48 26 4
gpt4 key购买 nike

我应该在 ASP.NET MVC 应用程序的相应 Controller 中使用 try-catch block (旨在捕获/处理 StaleObjectStateException)包装对存储库的调用,还是应该发生在存储库实现中?

还有我如何处理异常,通知用户。据我了解,没有回滚的意图?

谢谢!

最佳答案

问题归结为一个不同的问题:在哪里以及如何处理实体的并发修改?即:用户 A 和用户 B 编辑同一条记录,当稍后保存记录的人(用户 B)收到 StaleObjectStateException,因为他编辑的版本现在已过时。

这里有一些想法:

  1. 通过蛮力强制使用户 B 的版本成为“正确的”版本,例如通过从数据库中检索记录的当前版本并将用户 B 版本的整个状态应用于它。如果用户 A 发生了变化,例如“电子邮件地址”字段,用户 B 更改了“用户名”字段。使用这种方法,用户 A 所做的一切都消失了。在这种方法中,您将捕获 StaleObjectStateException 并修复存储库中的所有内容。

  2. “智能”方法:与方法 1 类似,存储库中的所有内容都是固定的(即,它完全捕获并处理 StaleObjectStateException),但它使用领域知识有选择地仅应用用户 B 所做的部分更改。例如。如果用户 A 更改了电子邮件地址,用户 B 更改了用户名,这些更改不会相互排斥,因此存储库只能更新电子邮件地址。如果同时更改了记录的两个不直接相互依赖的方面,则此方法很有效。实现此解决方案可能会相当复杂,具体取决于您希望变得多“聪明”。

  3. 拒绝存储库中的并发更改。在这种情况下,如果发生 StaleObjectStateException,存储库需要报告它无法保存记录。它实际上可能只是让异常冒泡,但随后您将 NHibernate 泄漏到例如 Controller 。相反,您可以使用对您的域有意义的更有用的详细信息抛出您自己的异常。在这种情况下, Controller 是捕获该异常的好地方。然后,您可以选择不同的操作方式,例如:

    • 通知用户由于另一个用户的同时更改而无法保存记录并丢弃所有更改,迫使他从头开始做所有事情。这对用户来说当然是痛苦的,只有在这种情况很少发生的情况下才应该这样做。
    • 将问题告知用户并让他决定要做什么,例如强制他的更改或重新开始。

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

关于c# - 在哪里处理 StaleObjectStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9431656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com