Nhibernate 在每请求会话web环境中死锁后重播事务

Nhibernate 在每请求会话web环境中死锁后重播事务,nhibernate,deadlock,Nhibernate,Deadlock,如果出现死锁,我希望能够重新运行事务。他在书中提到,你需要扔掉整个NHibernate课程,重新开始 在Windows应用程序中重新启动会话相对简单,但在web应用程序中使用“按请求会话”模块时,您将如何执行此操作?会话在IHTTP模块中打开和关闭。我能想到的唯一方法就是以某种方式重新发布http post。这将非常棘手,并且可能会重新执行已成功提交的其他事务(因为每个会话有多个事务)。您需要以某种方式公开ISessionFactory,以便在需要时使用它创建新的ISession。一个快速的解决

如果出现死锁,我希望能够重新运行事务。他在书中提到,你需要扔掉整个NHibernate课程,重新开始


在Windows应用程序中重新启动会话相对简单,但在web应用程序中使用“按请求会话”模块时,您将如何执行此操作?会话在IHTTP模块中打开和关闭。我能想到的唯一方法就是以某种方式重新发布http post。这将非常棘手,并且可能会重新执行已成功提交的其他事务(因为每个会话有多个事务)。

您需要以某种方式公开ISessionFactory,以便在需要时使用它创建新的ISession。一个快速的解决方案是在global.asax中设置一个静态属性。

另一种方法是首先找出死锁发生的原因。看看死锁图。也许可以通过更改程序或添加索引来修复死锁。是的,每个人都这么说,但是如果死锁已经发生,那就太晚了。太晚了吗?只有在死锁发生后才能修复死锁。如果您正在运行mssql,请设置跟踪以捕获死锁事件,包括死锁图。通过查看哪两个语句是死锁的,您将学到很多。我已经多次遇到过这种情况。我的意思是,如果死锁已经发生,那么现在开始弄清楚它发生的原因已经太迟了——它已经发生了,并且用户出现了一个错误。我非常清楚如何分析和修复频繁死锁的系统-我正在寻找的是一种通用的重新运行事务的方法,它将满足我还没有机会分析和修复代码的情况。是的,我知道如何创建新会话,问题是如何设计一个解决方案来重新运行失败的事务。在什么时候重新运行事务?在每个控制器的代码中?在Http模块中,我将把操作封装在自己的类(命令模式)中,并使用新会话在控制器中重新运行事务。然而,根据我的经验,当事务失败时,通常需要用户交互。我也会投入更多的精力来防止死锁(在我的经验中很少见),而不是尝试自动重试。