SELECT'TEST 4: impl_tran on with nested user tran, DMV results are unexpected'
setimplicit_transactionsON
select'Impl_tran ON only'AS[Test4a],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
select'Impl_tran ON with one user tran'AS[Test4b],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
select'Impl_tran ON with two user trans'AS[Test4c],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
SELECT'TEST 5: What do the DMVs look like without using IT?'
setimplicit_transactionsOFF
select'Without a transaction'AS[Test5a],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
select'With one transaction'AS[Test5b],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
select'With two transactions'AS[Test5c],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
SELECT'TEST 6: What do the DMVs look like when I use named transactions'
setimplicit_transactionsOFF
select'Without a transaction'AS[Test6a],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
select'With one transaction'AS[Test6b],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
select'With two transactions'AS[Test6c],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
--so the rule seems to always be to show implicit_transaction when that is ON, else show the outermost user_transaction name (or just user_transaction if there is no name)
--...or is this the rule?
--let's see what happens with "marked transactions"
SELECT'TEST 7: impl_tran OFF/nested "marked" user tran, expect OuterNamedTran'
SELECT'TEST 8: impl_tran ON with marked transactions'
setimplicit_transactionsON
begintranOuterNamedTranWITHMARK'OuterMark'
select'OuterNamedTran and mark'AS[Test8a],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
select'InnerNamedTran and mark'AS[Test8b],@@TRANCOUNTAS[@@trancount],tat.name[dmtranname],tst.is_user_transaction,CASEWHENtat.transaction_state=2THEN'Active'ENDAStransaction_state,tat.transaction_status2
So the rule is that sys.dm_tran_active_transactions returns the "name" of the OUTER transaction (or implicit_transaction) and never any rows for the inner transactions as
long as transaction_status2 = 258 (which, I guess means non-marked transactions). When a transaction is marked then sys.dm_tran_active_transactions returns the outer most
named and marked transaction, regardless of whether there is an implicit_transaction. We can deduce this because transaction_status2= 266 (which I guess means HasMarkedTransaction
transaction_status2 is not supported and future compatibility is not guaranteed.