Wenn mehrere Systeme beteiligt sind, wird’s schnell heikel

Verteilst Du Transaktionen ĂŒber mehrere SQL Server, oder ĂŒber SQL + andere Systeme (z. B. MSMQ, Oracle, Dateiaktionen), brauchst Du einen Koordinator.
DafĂŒr gibt’s den Microsoft Distributed Transaction Coordinator (MSDTC).

FrĂŒher war das oft fehleranfĂ€llig, langsam und schwer zu debuggen.
Seit SQL Server 2016 und besonders ab 2019 hat sich das spĂŒrbar verbessert.

Was ist neu?

  • Verbesserte Performance beim Two-Phase-Commit
  • Mehr StabilitĂ€t bei Server-Restarts und Timeouts
  • Native UnterstĂŒtzung fĂŒr DTC ĂŒber Always On (ab 2016)
  • Mehr Transparenz in System Views und DMVs
  • Verbesserte Isolationsbehandlung ĂŒber Servergrenzen hinweg

Damit werden verteilte Transaktionen endlich praxistauglich. Auch im KMU-Umfeld.

WofĂŒr ich Distributed Transactions einsetze

  • gleichzeitiges Schreiben in zwei SQL Server (z. B. ERP + BI-Datenbank)
  • kombinierte Transaktionen SQL + MSMQ
  • Synchronisierung von Access + SQL + Web-API

Du willst konsistente Daten – auch wenn’s ausfĂ€llt?
Dann brauchst Du DTC. Und musst ihn richtig aufsetzen.

Vorbereitung: DTC aktivieren und konfigurieren

Auf beiden Servern:

  • Dienst „Distributed Transaction Coordinator“ starten
  • Netzwerkzugriff in DTC-Einstellungen aktivieren
  • Firewall-Ausnahmen fĂŒr Port 135 + RPC aktivieren
  • NT AUTHORITY\NetworkService Zugriff auf MSDTC geben

Abfrage zur PrĂŒfung:

SELECT * 
FROM sys.dm_tran_active_transactions 
WHERE transaction_type = 3; -- 3 = DTC

Beispiel: DTC mit zwei SQL Servern

BEGIN DISTRIBUTED TRANSACTION;

-- Lokaler Server
INSERT INTO dbo.Buchungen (Buchungstext, Betrag)
VALUES ('Server A', 100);

-- Entferntes System (verknĂŒpfter Server)
EXEC [ServerB].Datenbank.dbo.Proc_BuchungAnlegen 'Server B', 100;

COMMIT TRANSACTION;

FrĂŒher war das wacklig.
Heute: deutlich stabiler, mit sauberer Fehlererkennung.

Neuerung: Automatisierte Promotion vermeiden

FrĂŒher wurde jede Verbindung zu einem zweiten Server automatisch promoted → DTC.
Ab SQL Server 2016 kannst Du das verzögern (Lazy Transaction Promotion).

-- Erst wenn nötig, wird distributed
BEGIN TRANSACTION;

-- Lokale Operationen
UPDATE Kunden SET Status = 'aktiv' WHERE KundenID = 123;

-- Erst jetzt: remote Operation, DTC wird aktiv
EXEC [RemoteServer].DB.dbo.RemoteProc;

COMMIT;

Das reduziert DTC-Overhead.
Und ist deutlich performanter.

Monitoring: Wer macht gerade was?

SELECT 
    at.transaction_id,
    at.transaction_type,
    at.transaction_state,
    at.transaction_begin_time,
    dtc.state_desc,
    dtc.name
FROM sys.dm_tran_active_transactions at
JOIN sys.dm_tran_current_transaction ct ON at.transaction_id = ct.transaction_id
LEFT JOIN sys.dm_dtc_transactions dtc ON at.transaction_id = dtc.transaction_id;

Damit findest Du hÀngende oder offene Transaktionen.
Hilfreich bei Deadlocks oder AbbrĂŒchen.

Tabelle: Vorteile der neuen DTC-Implementierung

ThemaVorherHeute (ab 2016/2019)
Performancelangsamdeutlich schneller
Always On UnterstĂŒtzungnicht möglichnativ unterstĂŒtzt
Lazy Transaction Promotionnicht vorhandenverfĂŒgbar
Monitoringkaum Einblickneue DMVs
IsolationslevelsinkonsistentserverĂŒbergreifend einheitlich

Mein Setup fĂŒr stabile DTC-Transaktionen

KomponenteUmsetzung
DTC aktiviertper PowerShell + GUI
Transaktionen prĂŒfenper DMVs und Logging
Fehler behandelnmit TRY...CATCH in beiden Systemen
Loggingmit eigener Log-Tabelle + Mail-Alarm
TestfÀllemit Netzwerkunterbrechung + Rollback

Beispiel: TRY…CATCH fĂŒr DTC-Transaktion

BEGIN TRY
    BEGIN DISTRIBUTED TRANSACTION;

    INSERT INTO dbo.Log (Nachricht) VALUES ('Start');

    EXEC [ServerB].DB.dbo.Proc_Eintrag 'remote';

    COMMIT;
END TRY
BEGIN CATCH
    ROLLBACK;
    INSERT INTO dbo.Log (Nachricht) VALUES ('Fehler: ' + ERROR_MESSAGE());
END CATCH

So verhinderst Du hÀngende Transaktionen und bekommst im Fehlerfall gleich Feedback.

Verteilte Transaktionen sind kein Hexenwerk mehr.

Aber Du musst wissen, was Du tust.

Mit den neuen DTC-Features bist Du nicht mehr der PrĂŒgelknabe,
wenn zwei Systeme gleichzeitig schreiben sollen.
Nur sauber konfigurieren –
und nicht vergessen: Rollback muss immer mitgedacht werden.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert