5

当 TransactionScope 首次出现时,我遇到了一些严重的问题,无法让它在我的开发机器 (XP) 和我们的数据库服务器 (Windows Server 2003) 之间工作。

当我更深入地研究它时,这似乎是一个棘手且普遍的问题,有可能在生产中成为头疼的问题,所以我决定不以这种方式处理事务(尽管我非常喜欢这种语法并且我真的很想要它去工作)。

这些问题仍然存在还是可以安全使用?你现在经常使用这个没有问题吗?

非常感谢!

注意:现在已经很久了,但我认为这个问题与分布式事务协调器有关。我摆弄了很长时间,但始终无法使其正常工作。

4

3 回答 3

8

Rick Strahl 在这里有一篇关于事务范围和 LINQ to SQL 的精彩文章。它的上下文更多的是 LINQ to SQL,但我认为有一些适用的原则可以帮助您解决问题。

编辑:为了更具体地回答您的问题,以下是 Strahl 对 TransactionScope 的看法:

传统上,TransactionScope 是分布式事务协调器 (DTC) 的 .NET 包装器,但它的功能有所扩展。一个问题是 DTC 在资源使用方面相当昂贵,并且它要求 DTC 服务实际上在机器上运行(这是另一个在客户端安装上特别麻烦的服务)。

但是,最近对 TransactionScope 和 SQL Server 客户端驱动程序的更新使得使用 TransactionScope 类和它提供的易用性成为可能,而无需 DTC,只要您针对单个数据库运行并使用单个一致的连接字符串

于 2009-07-20T21:06:45.600 回答
1

我已经使用 TransactionScope 一年多了,没有任何问题。但是,该应用程序是用户数量非常少的内部应用程序。此外,数据库和应用程序驻留在同一台服务器上。

以下是有关 TransactionScope 的一些信息以及在何处查找更多信息: 每当您创建一个 TransactionScope 对象时,它都会启动一个轻量级事务。那么只要你使用支持轻量级事务的单个连接/资源,事务将由资源管理器处理,消耗尽可能少的资源,性能非常好。当您将第二个连接/资源添加到事务范围时,事务管理器将自动升级为 OleTx 事务管理器,它可以使用 COM+ DTC 技术处理分布式事务。与不支持轻量级事务(如 SQL Server 7/2000、Oracle 和其他 RDBMS)的资源管理器的单个连接也会发生这种情况。

这里有两个资源可以帮助你:

“Microsoft Windows Server 2003 Service Pack 1 (SP1) 和 Microsoft Windows XP Service Pack 2 (SP2) 包括许多与安全相关的更新和更改。其中一些更改会影响 Microsoft 分布式事务协调器 (MSDTC) 服务。” Windows Server 2003 Service Pack 1 和 Windows XP Service Pack 2 中分布式事务处理协调器服务的新功能

Juval Lowy 关于 System.Transactions 的白皮书: 在 Microsoft .NET Framework 2.0 版中引入 System.Transactions

于 2009-07-21T15:18:00.713 回答
1

TransactionScope 仍然存在问题。在我当前的项目中,我们不定期地遇到“无法加入分布式事务”异常和 TransactionInDoubtException。这两个例外都与 TransactionScope 有关。两种例外情况的一种解决方法是使用单个 oracle 连接(当然如果适用)。阅读以下内容:避免不必要的分布式事务升级

有关性能影响的信息,请阅读我的帖子:使用 TransactionScope 的性能影响

于 2012-02-04T18:58:34.803 回答