Nhibernate 运行NServicebus服务时出现死锁会导致连接损坏

Nhibernate 运行NServicebus服务时出现死锁会导致连接损坏,nhibernate,deadlock,nservicebus,Nhibernate,Deadlock,Nservicebus,我们正在为web应用程序运行NServiceBus,以处理用户执行“类似批处理”操作的情况。像fire一样,一个影响1000个实体的命令 它工作得很好,但在中等负载期间,我们会遇到一些死锁,这不是问题,请重试消息。。对吧?:) 当下一条消息到达并试图打开连接时,就会出现问题。然后,连接“损坏” 我们得到以下错误: System.Data.SqlClient.SqlException(0x80131904):不允许启动新请求,因为它应该带有有效的事务描述符 我在网上搜索过,我认为我们的问题是: 解

我们正在为web应用程序运行NServiceBus,以处理用户执行“类似批处理”操作的情况。像fire一样,一个影响1000个实体的命令

它工作得很好,但在中等负载期间,我们会遇到一些死锁,这不是问题,请重试消息。。对吧?:)

当下一条消息到达并试图打开连接时,就会出现问题。然后,连接“损坏”

我们得到以下错误: System.Data.SqlClient.SqlException(0x80131904):不允许启动新请求,因为它应该带有有效的事务描述符

我在网上搜索过,我认为我们的问题是:

解决方法应该是禁用连接池。但我不喜欢那样,因为性能会下降

我们正在运行NServiceBus 2.6和NHibernate 3.3


有没有人有这方面的经验?升级NServiceBus是否有帮助?

我以前见过这种情况,如果您的设计允许,请尝试将事务拆分为两个,如果您将消息事务一直流到数据库操作,任何故障都会产生级联效应,并且会影响(理想情况下不应该如此)以及任何后续消息。

您可以发布一个事件来表示命令已完成,然后让多个订阅者在此事件上操作以更新效果实体,而不是更新命令中的1000个实体。在我看来,更新1000个实体的命令应该拆分为多个较小的命令。看看这些传奇故事,看看如何处理长时间运行的业务流程。例如,您可能会遇到诸如“流程已启动”、“步骤1已完成”、“步骤2已完成”、“流程已完成”等问题。

这听起来与我们遇到的问题非常相似。我们还没有解决这个问题,目前正在蹒跚前行。关于MSDTC,您的设置是什么?我们有两个web框(硬件负载平衡,ip粘性)和一个带有MS DTC服务器的故障切换sql server群集。我们现在已禁用连接池,问题不再出现。我想您已经有了比我从链接问题中可以帮助您的更多的信息,但我只是想在我们的例子中说明一下,问题显然因为糟糕的DTC性能导致SQL超时而恶化。如本文所述,使用远程DTC而不是本地DTC似乎可以缓解这些问题:Ok!谢谢,我会核实这是否与我们的环境有关。我们经历了一些“不应该”的SQL超时,这更清楚了一点,我的意思是使用嵌套事务。数据库事务不应该对整个消息事务产生影响。我们使用saga将所有事务分解为小的短事务。但当死锁仍然发生时,当连接池打开时,我们会得到错误。这就是我们要做的。例如,当用户发出影响1000个实体的命令时,我们将该命令拆分为每个“实体”。但当其中一个事务陷入僵局时,返回到连接池的连接已损坏,当服务重试消息时,它将获得损坏的连接,我们将获得所有新消息的事务错误消息。。