【发布时间】:2010-04-23 19:47:47
【问题描述】:
我最近升级了一个自定义 Windows 服务,以便将 TransactionScope 用于嵌套事务。它在我的旧开发机器(XP sp3)和测试服务器(Server 2003)上本地运行良好。但是,它在我的新 Windows 7 机器和 2008 Server 上都失败了。它的目标是 2.0 框架;我尝试改用 3.5,但仍然失败。
奇怪的是它是如何失败的;不抛出异常。服务本身只是超时。我添加了跟踪代码,但在打开下面的数据库查找 #2 的连接时它失败了。我还启用了对 System.Transactions 的跟踪;它实际上是在为失败的连接编写块时中途中断。
我们运行了 SQL 跟踪,但只显示了第一个查找。我输入了代码跟踪,它在第二次查找之前到达跟踪行,但之后就没有了。我在访问两个不同的 SQL 服务器(都是在 Server 2003 上运行的 SQL 2005)时也有同样的经历。连接字符串正在使用 SQL 帐户(不是 Windows 集成)。在这种情况下,所有连接都针对同一个数据库,但考虑到代码的性质,它被升级到 MSDTC。
这是基本的代码结构:
TransactionOptions options = new TransactionOptions();
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, options))
{
// Database lookup #1
TransactionOptions options = new TransactionOptions();
options.IsolationLevel = Transaction.Current != null ? Transaction.Current.IsolationLevel : System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{
// Database lookup #2; fails on connection.Open()
// Database save (never reached)
scope.Complete();<br/>
}
scope.Complete();<br/>
}
我的本地防火墙已禁用。该服务通常使用网络服务运行,但我也尝试了我的用户帐户(结果相同)。
简而言之,我在 Web 应用程序中广泛使用了相同的通用技术,并且没有遇到任何问题。我提取了代码并在本地 Windows 窗体应用程序中运行良好。如果有人有任何额外的调试想法(或者更好的解决方案),我很想听听。
【问题讨论】:
-
数据库是一样的吗?是否/是否在同一台机器上?考虑分布式事务的问题(它们需要 MSTDC 处于活动状态并已配置)。我的 2 美分。
-
针对不同的数据库服务器(Windows Server 2003 上的 SQL 2005)也会出现同样的问题。 MSDTC 肯定参与其中(因为它似乎在尝试争取第二个 SQL 调用时遇到问题)。为什么它可以在 Windows 服务之外(或在 Server 2003 上的服务中)工作,我无法理解。
-
你能贴一些代码吗?服务器引擎总是一样的吗? Sql 2005 还是 2008?您使用哪种类型的身份验证,集成的还是“旧式 (sa)”?
-
已更新以包含更多信息和代码示例
标签: c# .net transactions transactionscope windows-services