C# asp.net WebForms中的nhibernate事务管理

C# asp.net WebForms中的nhibernate事务管理,c#,asp.net,nhibernate,transactions,webforms,C#,Asp.net,Nhibernate,Transactions,Webforms,我一直在研究针对ASP.Net应用程序(Webforms)的NHibernate事务管理。我发现的大多数文章倾向于按请求进行事务处理的方法。虽然我理解每一个请求的会话,并且完全支持它。然而,我并不完全理解每个请求的事务背后的原因 我的应用程序使用版本字段进行并发检查。如果抛出了问题,例如StaleObjectException或其他任何问题,则在调用Transaction.Commit()后将抛出该问题。我的问题是,如果这是在请求的末尾,您就不能很容易地知道哪个方法实际上有问题的代码,并且从问题

我一直在研究针对ASP.Net应用程序(Webforms)的NHibernate事务管理。我发现的大多数文章倾向于按请求进行事务处理的方法。虽然我理解每一个请求的会话,并且完全支持它。然而,我并不完全理解每个请求的事务背后的原因

我的应用程序使用版本字段进行并发检查。如果抛出了问题,例如StaleObjectException或其他任何问题,则在调用
Transaction.Commit()
后将抛出该问题。我的问题是,如果这是在请求的末尾,您就不能很容易地知道哪个方法实际上有问题的代码,并且从问题中回滚是极其困难的

例如,在StaleObjectException中,通常只需要使用更新的数据重新运行该方法


关于这方面有什么想法,以及交易管理的实践吗?根据业务逻辑,我倾向于尽可能多地开展交易。多个事务的问题是实际开始/结束事务的位置

当您回过头来思考web应用程序的底层本质时,每个请求的事务范例是有意义的。这是一个请求/响应系统,仅此而已。用户提交“某物”请求,应用程序将其转换为执行一个或一系列操作,然后应用程序向用户发送响应以指示其当前更新状态

在这个模型中,对应用程序的每个操作请求都可以(应该)是原子的。毕竟,从用户的角度来看,当出现错误时,概念上什么失败了?请求失败。出现此类故障时,应用程序应以两种方式响应:

  • 回滚与处理请求相关联的任何部分更改,以便持久化数据不会处于“部分”或“未定义”状态

  • 通知用户(在响应中)请求以某种方式失败

    我的问题是,如果这是在请求的末尾,您就不能很容易地知道哪个方法实际上有问题的代码,并且从问题中回滚是极其困难的

  • 你能用代码展示一个例子吗?我想知道这个问题是否可以通过应用程序设计的其他元素而不是事务结构来解决。也许请求的处理没有适当的原子化或封装

    (评论表明,以下内容可能更具个人观点,是NHibernate的正常行为)

    例如,在StaleObjectException中,通常只需要使用更新的数据重新运行该方法


    虽然我当然不是NHibernate方面的专家,但我还是不太明白这里说的是什么。通常,当异常发生时,简单地“重试”通常不是处理异常的好方法。

    是的,它被标记为“异常”,它是一个异常,详细说明了由于乐观并发性导致的不匹配。发生这种情况时,大多数情况下,您可以通过重新运行查询轻松地“修复”错误。关于StackOverflow的这个问题可能会让您了解NHibernate在乐观并发/版本检查()方面是如何工作的。因此,在这种情况下,在
    Page\u EndRequest
    状态下引发错误是没有意义的。@KarlCassar:这很公平,尽管它只会加剧我对大多数框架的厌恶。任何时候,当回答是“哦,这个框架有时会发生。你只需要记住做其他非标准的事情,它可能会很好”,那么我觉得这个框架在某种程度上失败了。当然,我并不期望任何代码都是完美的。但是,如果某个特定的库要求我从事其他不好的实践来使用它,我可能不会使用它。但这只是个人观点,超出了问题的范围,真的:)这到底是一种什么样的错误做法,如果您选择使用乐观并发检查,如何更好地克服这种“异常”?