在开始之前,我在一个使用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进程中。
提前感谢您提供任何帮助!
答案 0 :(得分:1)
我有一个系统,其中有多个进程和服务负责特定的数据库操作(更新和插入)。这个想法是更新可以在“安静”时段进行,通常是在晚上。 (报告建设......慢......)
是否NHibernate会回滚其他事务,因为一个单独的线程在其中有异常?
这取决于你如何编程。我们之前遇到的一个问题是连接没有正确关闭。当工作线程失败时,这些连接等待显式关闭。所以现在nhibernate会话代码位包含在try / catch / finally中,从而确保我们清理异常。然后我们可以在失败时回滚事务,然后在几秒钟后重新尝试。我假设像我的系统,数据库记录上的锁可能阻止另一个服务上的另一个进程。另一方面,如果主要过程消失,那么它们就是一个不同的问题。