我刚刚开始使用TransactionScope,我发现总会遇到意想不到的事情需要永远调试。
我认为拥有这些的综合列表对于那些“奇怪的错误”情况非常有用,并且可以扩展我们对平台奇怪性的了解。
关于我将如何使用事务范围的一些背景信息:
答案 0 :(得分:3)
我头顶的两件事:
您希望事务尽可能轻量级,dtc会带来很多开销。您还希望事务尽可能短,因此仅在应用程序服务器上而不是在Web服务器上引入它们。尽可能小地在应用程序服务器和数据库之间跳过网络,通过与应用程序服务器和数据库之间不同的连接在Web和应用程序服务器之间发送网络流量,并使最后一个快速尖叫,可笑的短暂联系。
如果您有多个应用程序服务器,您可以考虑在服务器上运行单个msdtc实例(例如在数据库或其中一个应用程序服务器上),并从所有应用程序服务器远程使用它,而不是每个运行它们的服务器拥有,但我不知道这有什么额外的好处。
答案 1 :(得分:1)
另请注意,如果您在事务期间更改了任何对象,则除非您添加代码来处理此事件,否则它们将不会回滚。
答案 2 :(得分:1)
希望有一天能帮到某人:
如果您的TransactionScope内部有多个SQL操作,则不会涉及DTC
即。打开,做一些,关闭。打开,做点什么,关闭。
现在为了问题: 如果你曾经在你的过程中(在另一个线程上)这样做
SqlConnection.ClearAllPools()
这恰好发生在你的两次行动之间 - DTC将立即参与。如果您没有运行DTC,它将抛出异常。
答案 3 :(得分:-2)
如果您使用SQL Server并检查@@ trancount,即使您有一个活动的TransactionScope,它也将为0.