Warum gibt es in SQL Server 2008 R2 einen Unterschied zwischen diesen Transaktions-DMVs?

7

Wenn ich die beiden folgenden Abfragen ausführe,

SELECT 
    session_id, transaction_id
    FROM sys.dm_tran_session_transactions;

UND

SELECT 
    session_id, request_id, at.transaction_id
    FROM sys.dm_tran_active_transactions at
        JOIN sys.dm_exec_requests r
            ON r.transaction_id = at.transaction_id;

Ich habe die BOL für 1 und 2 gelesen , sehe aber keine klare Erklärung dafür, warum der Unterschied auftreten würde.

Ich bekomme unterschiedliche Ergebnisse. Die erstere Abfrage gibt keine Ergebnisse zurück, die letztere gibt aktive Transaktionen mit Sitzungs- und Transaktions-IDs zurück. Das request_idist 0, was meiner Meinung nach bedeutet, dass es die einzige Anfrage der Sitzung ist. Könnte mir jemand helfen zu verstehen, warum es einen Unterschied zwischen den beiden Konzepten gibt, die ich oben abgefragt habe?

BEARBEITEN

Ich habe gerade die Abfragen erneut durchgeführt und erhalte jetzt ein Ergebnis für die erste DMV, die eine enthält session_id, die in der zweiten Ergebnismenge nicht enthalten ist.

Swasheck
quelle

Antworten:

6

Es scheint, dass sys.dm_tran_session_transactionsTransaktionen mit automatischem Festschreiben nicht enthalten sind:

-- No result
SELECT 
    session_id, 
    transaction_id
FROM sys.dm_tran_session_transactions;

Die Verwendung einer expliziten Transaktion liefert folgende Ergebnisse:

BEGIN TRANSACTION;

    -- Row returned    
    SELECT 
        session_id, 
        transaction_id
    FROM sys.dm_tran_session_transactions;

ROLLBACK TRANSACTION;

Die DMVs sind Ansichten zu internen Strukturen, und die Dokumentation ist oft nicht so umfassend wie in anderen Bereichen. Ein Teil davon kann daran liegen, dass es unpraktisch wäre, jedes Mal, wenn sich das DMV-Verhalten ändert, einen vollständigen Abschreibungszyklus zu durchlaufen, aber in diesem Fall ist es wahrscheinlich nur ein Versehen. Sie können den Dokumentationsmangel in Connect melden .

Adam Machanic fand beim Schreiben seines sp_WhoIsActive- Tools alle möglichen merkwürdigen kleinen Verhaltensweisen bei den DMVs . Wenn es Ihren Zwecken entspricht, können Sie dies verwenden, anstatt zu versuchen, Ihre eigenen Überwachungsabfragen zu schreiben.

Paul White 9
quelle
4

sys.dm_tran_session_transactionsist eine Zwischenansicht, die es ermöglicht, die DMVs, die hauptsächlich auf session_id column- sys.dm_exec*DMVs identifiziert werden , mit anderen sys.dm_tran_*DMVs zu verbinden. Diese Ansicht zeigt an, ob es sich bei der Transaktion um eine Benutzertransaktion is_user_transaction= 1 oder eine Systemtransaktion mit is_user_transaction= 0 handelt.

Auf der anderen Seite ist sys.dm_tran_active_transactions- die DMV, die Transaktionsinformationen speichert, die den Status und den Status jeder Transaktion anzeigen - initiiert, aber nicht abgeschlossen, Typ usw. auf der SQL Server-Instanz. Es gibt auch Informationen zu verteilten Transaktionen. Diese DMV gibt Ergebnisse für alle Datenbanken auf der Serverinstanz aus und ist eine Momentaufnahme der aktuell aktiven Transaktionen. Die Ergebnisse ändern sich jedes Mal, wenn die Abfrage ausgeführt wird, da sich der Status der einzelnen Transaktionen ändert.

Spaltenlisten und die Bedeutung der einzelnen Spalten finden Sie unter sys.dm_tran_session_transactions und sys.dm_tran_active_transactions .

Kin Shah
quelle
Das war auch mein erster Gedanke. Ich frage, warum die DMV session_transaction nicht dieselben Informationen hat, da eine Sitzung eine Anforderung initiiert hat, die eine offene und aktive Transaktion enthält. Warum befinden sich meine aktiven Transaktionen nicht in der Zwischenansicht für Sitzungstransaktionen?
Swasheck
@swasheck Nur neugierig, verwenden Sie einen Service Broker (lokal oder DTC)? Dies ist hilfreich. Funktionsweise: sys.dm_tran_session_transactions ( blogs.msdn.com/b/psssql/archive/2012/01/24/… ). sys.dm_tran_session_transactionsDMV gibt nur Zeilen für Sitzungen aus, die KEINE Sitzungen auf Systemebene sind.
Kin Shah
Nee. Kein Service Broker
Swasheck
2

Beide DMVs sind eine Momentaufnahme dessen, was genau zum Zeitpunkt ihrer Ausführung geschieht. Es ist daher sehr wahrscheinlich, dass auf einem ausgelasteten System ausgeführt wird

SELECT 
session_id, transaction_id
FROM sys.dm_tran_session_transactions;

SELECT 
session_id, transaction_id
FROM sys.dm_tran_session_transactions;

könnte unterschiedliche Ergebnismengen anzeigen.

Max Vernon
quelle
Wahrscheinlich, aber hier nicht der Fall. Vielen Dank. Ich habe festgestellt, dass die Transaktionen über Datenbanken verteilt sind. Ich frage mich, ob mir das etwas sagen sollte.
Swasheck