Partager via


MSDTC Does Not Correctly Log All XA Transaction Details

 

If you’re having to work with the Microsoft Distributed Transaction Coordinator transaction logs, you must already be having a very fun day. To add to your joy, I’ve recently learned that MSDTC does not correctly log XA transaction details within the Transaction Logs. Let me give you some details that I’ve picked up.

Two Scenarios for xa_commit

With TMONEPHASE

The TMONEPHASE flag notifies us the caller is using one-phase commit optimizations.  If you want to dump out the transaction logs here you will only find the following entry for a commit (formatted to read more clearly):

pid=5888 tid=5024 time=01/23/2015-12:14:30.098 seq=758 eventid=RM_ENLISTED_IN_TRANSACTION

Compare this to the Transaction::Commit call which utilize one-phase commit optimizations (I’ve bolded what is missing):

pid=5524           tid=5404           time=01/23/2015-12:11:48.822       seq=71             TRANSACTION_BEGUN                   
pid=5524           tid=5404           time=01/23/2015-12:11:48.822       seq=72             RM_ENLISTED_IN_TRANSACTION          
pid=5524           tid=5404           time=01/23/2015-12:11:48.822       seq=73             RECEIVED_COMMIT_REQUEST_FROM_BEGINNER
pid=5524           tid=5404           time=01/23/2015-12:11:48.822       seq=74             TRANSACTION_COMMITTED               

Without TMONEPHASE

The situation is better when we do use the one-phase optimizations:

pid=5888           tid=5808           time=01/23/2015-12:14:46.586       seq=3473           eventid=RM_ENLISTED_IN_TRANSACTION
pid=5888           tid=5808           time=01/23/2015-12:14:46.586       seq=3474           eventid=RM_ENLISTED_IN_TRANSACTION
pid=5888           tid=5808           time=01/23/2015-12:14:46.586       seq=3475           eventid=RM_ISSUED_PREPARE         
pid=5888           tid=5808           time=01/23/2015-12:14:46.586       seq=3476           eventid=RM_ISSUED_PREPARE         
pid=5888           tid=5808           time=01/23/2015-12:14:46.601       seq=3477           eventid=RM_VOTED_COMMIT           
pid=5888           tid=5808           time=01/23/2015-12:14:46.601       seq=3478           eventid=RM_VOTED_COMMIT           
pid=5888           tid=5808           time=01/23/2015-12:14:46.617       seq=3479           eventid=RM_ISSUED_COMMIT          
pid=5888           tid=5808           time=01/23/2015-12:14:46.617       seq=3480           eventid=RM_ISSUED_COMMIT          
pid=5888           tid=5808           time=01/23/2015-12:14:46.617       seq=3481           eventid=RM_ACKNOWLEDGED_COMMIT    
pid=5888           tid=5808           time=01/23/2015-12:14:46.617       seq=3482           eventid=RM_ACKNOWLEDGED_COMMIT    

Compare this to the Transaction::Commit call which does not utilize one-phase commit optimizations (I’ve bolded what is missing)::

pid=5524           tid=5380           time=01/23/2015-12:12:03.348       seq=12141          TRANSACTION_BEGUN                    
pid=5524           tid=5980           time=01/23/2015-12:12:03.348       seq=12142          RM_ENLISTED_IN_TRANSACTION           
pid=5524           tid=5380           time=01/23/2015-12:12:03.348       seq=12143          RM_ENLISTED_IN_TRANSACTION           
pid=5524           tid=5380           time=01/23/2015-12:12:03.348       seq=12144          RECEIVED_COMMIT_REQUEST_FROM_BEGINNER
pid=5524           tid=5380           time=01/23/2015-12:12:03.348       seq=12145          RM_ISSUED_PREPARE                    
pid=5524           tid=5380           time=01/23/2015-12:12:03.348       seq=12146          RM_ISSUED_PREPARE                    
pid=5524           tid=5380           time=01/23/2015-12:12:03.348       seq=12147          RM_VOTED_COMMIT                      
pid=5524           tid=5980           time=01/23/2015-12:12:03.348       seq=12148          RM_VOTED_COMMIT                      
pid=5524           tid=5980           time=01/23/2015-12:12:03.364       seq=12149          TRANSACTION_COMMITTED                
pid=5524           tid=5980           time=01/23/2015-12:12:03.364       seq=12150          RM_ISSUED_COMMIT                     
pid=5524           tid=5980           time=01/23/2015-12:12:03.364       seq=12151          RM_ISSUED_COMMIT                     
pid=5524           tid=5980           time=01/23/2015-12:12:03.364       seq=12152          RM_ACKNOWLEDGED_COMMIT               
pid=5524           tid=5380           time=01/23/2015-12:12:03.364       seq=12153          RM_ACKNOWLEDGED_COMMIT               

I’ll be following this entry up later with some information about XA performance compared to OleTx transactions.