NHibernate 异常破坏其他进程

NHibernate Exceptions Breaking other Processes

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

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

例如:

我们有一个 Windows 在我们正常的 Web 应用程序之外的服务,它执行大量数据管理和自动化流程。让我们考虑以下场景:

=> 服务 A 正在将带有单词 "Hello" 的 table 填充到数据类型为 VARCHAR(5)

的列中

=> 服务 B 正在将单独的 table 上的值从单词 "August" 更新为 "September",数据类型为 VARCHAR(50)

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

服务 B 在一个事务中,所有更新都发生在同一个事务中。

服务 A 和服务 B 显然不共享同一个事务。

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

如果服务 A 尝试进入 "Hello Again" 并违反了数据约束,服务 B 将在未完成该过程的情况下退出。因此,服务 A 和服务 B 通常会发生回滚,因此不会提交任何更改。

如果这个解释过于隐晦,我深表歉意,但数据和过程无关;重要的是异常和结果。几乎我们所有的进程都这样做,发生的异常可能是任何事情,包括数据类型不匹配、超时或数据库死锁。

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

我想我的意思是 NHibernate 是否会回滚其他事务,因为单独的线程中有异常?

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

提前感谢您提供的所有帮助!

我有一个系统,其中多个进程和服务负责特定的数据库操作(更新和插入)。这个想法是更新可以在 "quiet" 时间段内执行,通常是在晚上。 (报表生成...慢..)

is if NHibernate will roll back other transactions because a separate thread had an exception within it?

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