【问题标题】:Nested Transaction issues within custom Windows Service自定义 Windows 服务中的嵌套事务问题
【发布时间】: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


【解决方案1】:

用新的事务范围包围您的数据库查找并使用抑制选项。即使有 nolock 提示,select 也会锁定 sql2005 中的记录。

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 2013-04-14
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多