6

我刚刚开始使用 TransactionScope,我发现我总是遇到一些意想不到的事情,需要永远调试。

我认为拥有这些综合列表对于那些“奇怪的错误”情况非常有用,并且可以扩展我们对平台中奇怪的知识。

关于我将如何使用事务范围的一些上下文:

  • Web应用程序
  • 多个 Web 服务器、应用程序服务器和 sql 服务器
  • 事务将主要是数据库事务,但有些事务将被提升以写入 MSMQ。
4

3 回答 3

3

2件事让我头疼:

  • 当您在同一范围内使用多个连接对象时,事务将被提升,即使连接具有相同的连接字符串(这在 sql 2008 中已修复)。在此线程中阅读更多内容,dbconnectionscope解决 sql 2005 上的该问题
  • msdtc 实例需要能够相互看到并且需要正确设置其安全性 http://support.microsoft.com/kb/899191(允许入站和出站,不需要相互身份验证通常是最安全的选择)。使用 DTCPing 解决 dtc 实例之间的连接问题,如下所述:http: //support.microsoft.com/kb/306843

您希望事务尽可能轻量级,dtc 引入了很多开销。您还希望事务尽可能短,因此只在应用程序服务器上而不是在 Web 服务器上引入它们。使应用程序服务器和数据库之间的网络跳跃尽可能小和尽可能快,通过与应用程序服务器和数据库之间不同的连接在 Web 和应用程序服务器之间发送网络流量,并使最后一个快速尖叫,可笑的短连接。

如果您有多个应用程序服务器,您可以考虑在服务器上运行一个 msdtc 实例(例如,在数据库或其中一个应用程序服务器上)并从所有应用程序服务器远程使用它,而不是每个应用程序服务器都运行自己的,但是我不知道这有什么额外的好处。

于 2009-12-16T14:33:56.823 回答
1

希望有一天这会对某人有所帮助:

如果您的 TransactionScope 内部有多个 SQL 操作,则不会涉及 DTC

  1. 您为每个连接使用相同的连接字符串
  2. 连接不是嵌套的。

即打开,做某事,关闭。打开,做某事,关闭。

现在的问题:如果你曾经在你的进程中这样做(在另一个线程上)

SqlConnection.ClearAllPools()

这恰好发生在您的两次操作之间 - DTC 将立即参与其中。如果您没有运行 DTC,它将引发异常。

于 2013-02-12T04:18:09.167 回答
-2

如果您使用 SQL Server 并检查 @@trancount,即使您有一个活动的 TransactionScope,它也会为 0。

于 2009-12-16T15:18:33.313 回答