NHibernate Exceptions打破了其他进程

时间:2015-03-23 15:07:40

标签: c# asp.net .net nhibernate fluent-nhibernate

在开始之前,我在一个使用NHibernate和C#的环境中。我们不使用JavaScript实现;只是C#在后端。我们在Windows服务中结合了ASP.NET 3.5和.NET 3.5,它们分离了不同的进程线程。

有没有人遇到NHibernate的问题,异常会导致其他进程中断?

例如:

我们的普通Web应用程序之外有一个Windows服务,它可以执行大量数据管理和自动化流程。让我们考虑以下情况:

=>服务A将具有单词“Hello”的表填充到数据类型为VARCHAR(5)的列中

=>服务B正在使用数据类型VARCHAR(50)

将单词表中的值从“August”更新为“September”

服务A在一个事务中,所有插入都发生在同一个事务中。

服务B处于同一交易中发生所有更新的交易中。

服务A和服务B显然不共享相同的交易。

这些服务在不同的线程中运行并同时执行。

如果服务A尝试输入“Hello Again”并违反数据约束,则服务B将退出而不完成该过程。因此,服务A和服务B上通常会发生回滚,因此不会进行任何更改。

如果这个解释过于神秘,我很抱歉,但数据和流程无关紧要;这是例外,结果是重要的。几乎所有的进程都会这样做,并且发生的异常可能只是几乎任何事情,包括数据类型不匹配,超时或数据库死锁。

这是所有理论,所以我没有特定的代码可以保证复制它。

我想我得到的是NHibernate是否会回滚其他事务,因为一个单独的线程在其中有异常?

还请理解Windows服务是我们复制它的最简单方法,但我们也看到过这种情况发生在ASP.NET进程中。

提前感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:1)

我有一个系统,其中有多个进程和服务负责特定的数据库操作(更新和插入)。这个想法是更新可以在“安静”时段进行,通常是在晚上。 (报告建设......慢......)

  

是否NHibernate会回滚其他事务,因为一个单独的线程在其中有异常?

这取决于你如何编程。我们之前遇到的一个问题是连接没有正确关闭。当工作线程失败时,这些连接等待显式关闭。所以现在nhibernate会话代码位包含在try / catch / finally中,从而确保我们清理异常。然后我们可以在失败时回滚事务,然后在几秒钟后重新尝试。我假设像我的系统,数据库记录上的锁可能阻止另一个服务上的另一个进程。另一方面,如果主要过程消失,那么它们就是一个不同的问题。