我刚刚开始使用 TransactionScope,我发现我总是遇到一些意想不到的事情,需要永远调试。
我认为拥有这些综合列表对于那些“奇怪的错误”情况非常有用,并且可以扩展我们对平台中奇怪的知识。
关于我将如何使用事务范围的一些上下文:
- Web应用程序
- 多个 Web 服务器、应用程序服务器和 sql 服务器
- 事务将主要是数据库事务,但有些事务将被提升以写入 MSMQ。
我刚刚开始使用 TransactionScope,我发现我总是遇到一些意想不到的事情,需要永远调试。
我认为拥有这些综合列表对于那些“奇怪的错误”情况非常有用,并且可以扩展我们对平台中奇怪的知识。
关于我将如何使用事务范围的一些上下文:
2件事让我头疼:
您希望事务尽可能轻量级,dtc 引入了很多开销。您还希望事务尽可能短,因此只在应用程序服务器上而不是在 Web 服务器上引入它们。使应用程序服务器和数据库之间的网络跳跃尽可能小和尽可能快,通过与应用程序服务器和数据库之间不同的连接在 Web 和应用程序服务器之间发送网络流量,并使最后一个快速尖叫,可笑的短连接。
如果您有多个应用程序服务器,您可以考虑在服务器上运行一个 msdtc 实例(例如,在数据库或其中一个应用程序服务器上)并从所有应用程序服务器远程使用它,而不是每个应用程序服务器都运行自己的,但是我不知道这有什么额外的好处。
希望有一天这会对某人有所帮助:
如果您的 TransactionScope 内部有多个 SQL 操作,则不会涉及 DTC
即打开,做某事,关闭。打开,做某事,关闭。
现在的问题:如果你曾经在你的进程中这样做(在另一个线程上)
SqlConnection.ClearAllPools()
这恰好发生在您的两次操作之间 - DTC 将立即参与其中。如果您没有运行 DTC,它将引发异常。
如果您使用 SQL Server 并检查 @@trancount,即使您有一个活动的 TransactionScope,它也会为 0。