Distributed transactions route through the Microsoft Distributed Transaction Coordinator (MSDTC), and SQL Server’s calls into it are preemptive, the thread leaves cooperative scheduling until MSDTC answers. This page covers the family:
PREEMPTIVE_DTC_BEGINTRANSACTION: starting a new distributed transaction with DTC.PREEMPTIVE_DTC_ENLIST: registering (enlisting) SQL Server as a resource manager in a DTC transaction.PREEMPTIVE_DTC_ABORTREQUESTDONE: completing an abort request for a distributed transaction.PREEMPTIVE_OS_DTCOPS: the generic bucket for other DTC-related Windows calls.
Together they meter how much time your sessions spend talking to the transaction coordinator.
Are They a Problem?
They are honest latency accounting for a service outside SQL Server. Environments that use distributed transactions (linked-server writes in transactions, MSMQ/COM+ integration, some application frameworks) accumulate these routinely; the amounts track DTC call volume and MSDTC’s responsiveness. When the family’s average durations grow, distributed commits are slowing, and the cause is in MSDTC or between the coordinators: the local DTC service, firewall/RPC paths to remote coordinators, or clustered DTC configuration.
Remember every DTC transaction also promotes isolation and coordination costs inside SQL Server, distributed transactions are expensive by nature.
What To Do
- Attribute the load: which applications and linked-server calls run distributed transactions, and do they need to? Many can be redesigned to local transactions plus idempotent messaging.
- For slow DTC calls, test MSDTC health: service state,
DTCPingbetween the involved machines, RPC and firewall configuration. - In clusters and AGs, verify the DTC configuration matches Microsoft’s guidance for your topology; misconfigured clustered DTC is a classic source of slow or failing enlistments.
How To See It
Rank the family with Get-WaitStatistics; read it alongside DTC waits and MSDTC’s own event log entries.
Part of the SQL Server Wait Types Library.
Related deep dive: SOS_SCHEDULER_YIELD Wait Type.
Leave a Reply