In the last 6 months I have faced two cases of linked servers between a SQL Server 2008 R2 Instance running on Windows Server 2008 R2 and a SQL Server 2000 instance running on Windows 2003 were distributed transactions were not working correctly.
The root cause of the problem is still under investigation, however, trying to understand problem I verified that everything is correctly configured and did some tests.
I review the following points:
- Name resolution was working correctly
- Security setting of the DTC correctly configured
- The linked server without distributed transaction working correctly
- DTCPing worked
- As far as I remember the DTCTester also worked.
After all this points the distributed transactions were still failing. In my tests, I tried creating a Clustered DTC in the SQL Server Group and the distributed transactions continue failing.
Later, without much hope, I tried deleting all the clustered DTC’s and configuring the local DTC, to my surprise, it worked.
At this point the question changed to What disadvantages do I have if I use the local DTC instead of a clustered DTC?, so I had to research and test this point.
The first point is, What is the reason to use a clustered DTC?, before Windows 2008, the reason was that it was the only way we could use the DTC on clustered environment, however, in Windows 2008 the number of options increased and now we can create more than one clustered DTC and also use the local DTC on each node. What are the advantages of a clustered DTC and what are the limitations of using the local?
The short answer (based in my knowledge and tests) is that in some scenarios it is better to use the clustered DTC but in most cases the difference is so small that using the local DTC instead of the clustered DTC doesn’t add a significant risk.
When is preferable to use the clustered DTC instead of the local DTC? , One scenario is when you have multiple instances of SQL Server in each node. In this case, multiple instances of SQL Server will use a single DTC which, in extreme cases, could cause bottleneck, if you want more scalability then you need multiple clustered DTC’s.
Another scenario is when the local DTC fails, in that case, the SQL instances won’t failover automatically. If you need more high availability for the distributed transactions it is better to use the clustered DTC.
In summary, it is recommended to use clustered DTC’s, however , if you are having problems with the clustered DTC, you can try with the local DTC.
“The opinions and views expressed in this blog are those of the author and do not necessarily state or reflect those of Microsoft”
If I understand what you are saying: Sometimes I need cluster DTC unless it doesn't work, and then I need local DTC. Except in extreme situations?! Can you define A) what is an extreme situation, B) what is the risk? "the difference is so small...doesn't add significant risk" -- what is the difference, and what is the risk?
What & When does SQL Server use DTC? If I have a single instance of SQL Server - single database even... does SQL Server even use DTC? Is it only needed for the Distributed DB scenario that you reference?
Maybe a few links to MS KB articles to help elaborate how you came to your different conclusions.
We should use Clustered DTC (it offers more advantages than Local DTC) but in some specifics scenarios between a SQL Server 2008 R2 Instance running on Windows Server 2008 R2 and a SQL Server 2000 instance running on Windows 2003 were distributed transactions were not working correctly (I’m still trying to figure out the reason). However on this scenario Local DTC works fine.
• Isolation issues may occur, Because only one MS DTC resource serves the entire cluster, if anything goes wrong with the DTC the failure can affect all applications. There’s no High Availability
• Performance can be degraded. For example, when the MS DTC resource must coordinate a transaction for an application that is not running on the same node as the DTC, latency in transaction coordination messaging can exceed the timeout requirements of the application.
If you only have one Server and all your databases are on this server, you will usually not need MSDTC, however there are applications that could use MSDTC even when using only one Database (Biztalk Server, MSMQ, COM+)
For more reference to MSDTC you can check this links: