SQL Server içerisinde Linked Server, OPENROWSET, OPENQUERY, OPENDATASOURCE, RPC, BEGIN DISTRIBUTED TRANSACTION yöntemlerini kullanarak uzaktaki bir sunucudaki veritabanı üzerinde tanımlama ve düzenleme işlemlerini transaction yönetiminde yapmak için karşı sunucuda Distributed Transaction Coordinator (DTC) servisini aktifleştirmemiz gerekir. Yani aşağıdaki gibi bir sorgu çalıştırdığımızda eğer karşı makineden DTC çalışmıyorsa MSDTC on server ‘DW’ is unavailable. hata mesajını alırız.
BEGIN DISTRIBUTED TRANSACTION SELECT * FROM DW.Deneme.dbo.Urun ROLLBACK
DW sunucusunda DTC servisini ayağa kaldırdıktan sonra aynı sorgu çalıştırdığımızda bu sefer aşağıdaki hata mesajı çıkar karşımıza.
OLE DB provider “SQLNCLI10¨ for linked server “DW” returned message “The partner transaction manager has disabled its support for remote/network transactions.”.
Msg 7391, Level 16, State 2, Line 2
The operation could not be performed because OLE DB provider “SQLNCLI10¨ for linked server “DW” was unable to begin a distributed transaction.
Bu hataları aşmak için öncelikle her 2 makinede de DTC ayarlarını düzenlememiz, uzaktan dağıtık transaction yönetimine izin vermemiz gerekir. Bunun için “Component Services” programı kullanılır. Bu programa “Start » Program » Administrative Tools » Component Services” bölümünden erişilir.
Program içerisindeki My Computer bölümünü sağ tıklayıp Properties penceresinia açtıralım.
Aşağıdaki adımları takip edip ilgili güvenlik bilgilerini set edelim. Bu işlemden sonra CTC servisi restart edilecektir. Şimdi sorgumuzu çalıştırdığımız Urun tablosu listenmiş olacaktır.
Aynı şekilde aşağıdaki uzak sunucu üzerinde bir güncelleme veya silme işlemi yapmak istediğimizde aşağıdaki hata mesajını alabiliriz.
BEGIN DISTRIBUTED TRANSACTION INSERT DW.Deneme.dbo.Urun VALUES(4,'U4') ROLLBACK
OLE DB provider “SQLNCLI10¨ for linked server “DW” returned message “Cannot start more transactions on this session.”.
Msg 7395, Level 16, State 2, Line 2
Unable to start a nested transaction for OLE DB provider “SQLNCLI10¨ for linked server “DW”. A nested transaction was required because the XACT_ABORT option was set to OFF.
Bu hatayı da aşmak için sorgularımız için SET XACT_ABORT komutunu kullanarak dağıtık transaction özelliğini aktifleştirmeliyiz.
SET XACT_ABORT ON BEGIN DISTRIBUTED TRANSACTION INSERT DW.Deneme.dbo.Urun VALUES(4,'U4') COMIIT SET XACT_ABORT OFF
Sonuç olarak DTC, dağıtılmış sorgular ve işlemler veri tutarlılığını sağlar.