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
Thema | Vorher | Heute (ab 2016/2019) |
---|---|---|
Performance | langsam | deutlich schneller |
Always On UnterstĂŒtzung | nicht möglich | nativ unterstĂŒtzt |
Lazy Transaction Promotion | nicht vorhanden | verfĂŒgbar |
Monitoring | kaum Einblick | neue DMVs |
Isolationslevels | inkonsistent | serverĂŒbergreifend einheitlich |
Mein Setup fĂŒr stabile DTC-Transaktionen
Komponente | Umsetzung |
---|---|
DTC aktiviert | per PowerShell + GUI |
Transaktionen prĂŒfen | per DMVs und Logging |
Fehler behandeln | mit TRY...CATCH in beiden Systemen |
Logging | mit eigener Log-Tabelle + Mail-Alarm |
TestfÀlle | mit 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.
No responses yet