dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/sqlserver-7391-distributed-transaction
SQL Server
SQL Server 2016–2022Bağlı Sunucular & DTC
9 dk okuma
Msg 7391, Level 16: OLE DB provider was unable to begin a distributed transaction

SQL Server Msg 7391 — Dağıtık İşlem Neden Başlamıyor?

7391 hatasının nedeni MS DTC, remote proc transaction promotion ayarı, güvenlik duvarı ve Kerberos delegation; dağıtık işlemi tamamen önlemenin yolları.

İnceleyen:Principal Database Reliability Architect
Test Edilen Sürümler: SQL Server 2022 CU15 & 2019 CU28 (Windows Server 2022 / Docker 29.7)

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 30 Ekim 2026
Test Edilen SürümlerSQL Server 2022 CU15 & 2019 CU28 (Windows Server 2022)
Gerekli YetkiALTER ANY LINKED SERVER, sysadmin (sp_serveroption için) ve Windows DTC yönetici izinleri
Risk Seviyesi
Highremote proc transaction promotion kapatıldığında yerel rollback uzak sunucudaki yazmayı geri almaz (atomiklik kaybı)
Beklenen ÇıktıUzak çağrının yerel transaction dışına alınması veya MS DTC / RPC port aralığı / Kerberos ayarlarıyla hatasız yürütülmesi
Geri Dönüş (Rollback) Planı:Dağıtık yazmaları uygulama katmanı idempotent kuyruğa devretme veya OPENQUERY pass-through tercih etme
Microsoft Docs: Troubleshoot Linked Server & DTC Errors
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

plaintext
Msg 7391, Level 16, State 1, Line 1 The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "ERP" was unable to begin a distributed transaction.

Aynı altyapı arızasından kaynaklanan komşu sağlayıcı hataları:

plaintext
Msg 7399: The OLE DB provider "MSOLEDBSQL" for linked server "ERP" reported an error. Msg 7302: Cannot create an instance of OLE DB provider "SQLNCLI11" for linked server "ERP". Msg 7411: Server 'ERP' is not configured for RPC.

Bu hata, bir bağlı sunucuya (Linked Server) yapılan sorgunun iki aşamalı tamamlama (Two-Phase Commit / 2PC) gerektiren bir dağıtık işleme (Distributed Transaction) yükseltilmesi gerektiğinde, ancak Windows MS DTC (Distributed Transaction Coordinator) servisinin veya ağ katmanının bu koordinasyonu kuramaması durumunda ortaya çıkar.


▸Neden Bazen Çalışıyor, Bazen Patlıyor?

Mühendislerin en çok şaşırdığı durum şudur: Aynı SELECT * FROM ERP.db.dbo.tablo sorgusu normalde sorunsuz çalışırken, aniden Msg 7391 vermeye başlar.

Neden? Çünkü dağıtık işlem gereksinimi yalnızca sorgu açık bir yerel işlemin (Transaction) içindeyken tetiklenir:

  • •Açık bir BEGIN TRANSACTION bloğu içinde uzak sunucuya erişilmesi.
  • •Bir Tetikleyici (Trigger) içinden uzak sunucuya sorgu gönderilmesi (Tetikleyiciler doğası gereği bir işlemin içindedir!).
  • •SET XACT_ABORT ON parametresi açıkken uzak prosedür çağrılması.
  • •Aynı transaction içinde iki farklı bağlı sunucuya dokunulması.

İşlem dışındaki bağımsız tekil bir SELECT sorgusu dağıtık işlem gerektirmez; ancak araya tek bir BEGIN TRAN girdiğinde SQL Server otomatik olarak MS DTC'yi devreye sokmaya çalışır ve hata patlar.


▸Teşhis Sırası ve Altyapı Kontrolleri

1. Bağlı Sunucu Tanımını ve RPC Ayarlarını İnceleyin

sql
SELECT name, product, provider, data_source, is_rpc_out_enabled, is_remote_login_enabled FROM sys.servers WHERE is_linked = 1;
NOT
SQLNCLI11 (SQL Server Native Client) artık Microsoft tarafından kullanımdan kaldırılmıştır (deprecated). Modern ortamlarda MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server) sağlayıcısı tercih edilmelidir.

2. MS DTC Hizmetini ve Ağ Erişimini Denetleyin

Dağıtık işlem gerçekten gerekliyse şu zincirin her iki sunucuda da kusursuz çalışması şarttır:

  • •Windows Hizmetlerinde Distributed Transaction Coordinator servisi çalışıyor (Running) durumda olmalıdır.
  • •dcomcnfg.exe (Bileşen Hizmetleri) altında: Network DTC Access, Allow Inbound, Allow Outbound kutucukları işaretli olmalıdır.
  • •RPC Dinamik Port Aralığı: Güvenlik duvarında sadece 135 portunu açmak yetmez; Windows RPC dinamik port aralığının (varsayılan 49152–65535) iki sunucu arasında çift yönlü açık olması gerekir.
  • •Kerberos Çift Atlama (Double Hop) Tuzağı: İstemci → SQL Server A → SQL Server B zincirinde Windows Authentication kullanılıyorsa, SQL Server A'nın hizmet hesabının Active Directory üzerinde Kerberos Constrained Delegation yetkisine sahip olması şarttır; aksi halde NTLM ikinci sunucuya kimlik taşıyamaz ve DTC bağlantısı çöker.

▸Çözüm Yolları

1. En Hızlı Çözüm: Dağıtık İşlem Yükseltmesini Kapatın

Eğer uzak sunucuya yalnızca okuma veya bağımsız prosedür çağrısı yapıyorsanız, transaction promotion özelliğini kapatarak hatayı derhal susturabilirsiniz:

sql
EXEC sp_serveroption 'ERP', 'remote proc transaction promotion', 'FALSE';
UYARI
Atomiklik Kaybı Riski: Bu ayar FALSE yapıldığında, yerel sunucuda ROLLBACK TRANSACTION çalıştırılsa bile uzak sunucuda yürütülen DML geri alınmaz! Yerel ve uzak taraf arasındaki atomiklik garantisi kalkar. Finansal yazma işlemlerinde bunu bilinçsizce kapatmayın.

2. Dağıtık Sorguyu OPENQUERY ile Yalıtın

OPENQUERY ifadesi sorguyu uzak sunucuda bağımsız olarak yürütür (pass-through) ve dağıtık işlem koordinatörüne ihtiyaç duymaz:

sql
INSERT INTO dbo.YerelTablo SELECT * FROM OPENQUERY(ERP, 'SELECT Id, Tutar FROM dbo.UzakFatura WHERE Durum = 1');

3. Uzun Vadeli Mimari Çözüm: Bağlı Sunucuları Terk Edin

Bağlı sunucular (Linked Servers) iki bağımsız veritabanını sıkı sıkıya birbirine bağlayarak ağ gecikmelerini ve kilitleri birbirine bulaştırır. İki sunucu arasında veri aktarımı gerekiyorsa, bunu veritabanı motoru düzeyinde DTC ile çözmek yerine Asenkron Mesajlaşma (Kafka/RabbitMQ) veya ETL Boru Hatları ile çözmek kurumsal dayanıklılık standardıdır.


▸İlgili Hata Rehberleri & Hub Bağlantıları

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (50)