Dopo aver letto l’ottimo articolo di Mauro [1] su MSDN, mi sono riproposto di investigare un dubbio che mi assilla da molto tempo, cioe’ capire esattamente quando una transazione e’ gestita dal Lightweight Transaction Manager (LTM) o quando e’ scalata al Distributed Transaction Coordinator (MSDTC).

In System.Transactions le transazioni sono inizialmente sempre gestite dal LTM. Poi in alcuni casi che vedremo, il LTM decide di scalare la transazione che viene gestita dal DTC.

Per analizzare i casi, occorre introdurre i concetti di Resource Manager Durable e transazione ad una o due fasi (per una piu’ approfondita spiegazione di cos’e’ un Resource Manager e delle fasi di una transazione, rimando all’articolo di Mauro [1])

Dall’articolo, un Resource Manager (RM) si dice durable quando:

“ha la capacità di gestire una transazione anche se questa dovesse venire interrotta a seguito di un blocco del sistema; è quindi in grado di tenere traccia, su un supporto persistente, del suo stato e eventualmente di riprendere la transazione dal punto in cui era stata interrotta.” [1]

Una transazione si dice ad una fase quando:

“il doppio passaggio (Prepare() / Commit()) non viene eseguito e viene invocato direttamente il commit della transazione.” [1]

Quindi, detto questo, una transazione viene scalata dal LTM al DTC quando [2][3]:

  1. Esiste un RM durable che non supporta le transazioni a una fase
  2. Esistono almeno due RM durable (anche se entrambi supportano transazioni ad una fase)
  3. La transazione si estende tra AppDomains differenti

Un RM per supportare le transazioni ad una fase, deve implementare l’interfaccia IPromotableSinglePhaseNotification.

Il transactional RM di SQL Server 2005 implementa questa interfaccia mentre quelli di SQL Server 7/2000, Oracle, DB2, MSMQ non la implementano. Quindi le transazioni su questi sistemi sono sempre gestite dal DTC con ovvie implicazioni in termini di prestazioni. [4]

References:

[1] http://www.microsoft.com/italy/msdn/risorsemsdn/netframework/transaction.mspx
[2] http://blogs.msdn.com/florinlazar/archive/2005/05/12/416805.aspx
[3] http://blah.winsmarts.com/2006/06/03/a-quick-primer-on-systemtransactions.aspx
[4] http://msdn2.microsoft.com/en-us/library/ms973865.aspx