İşlem yöneticisi uzak / ağ işlemleri için desteğini devre dışı bıraktı


86

SQL Server ve ASP.NET kullanıyorum. Aşağıdaki işleve sahibim:

Using js = daoFactory.CreateJoinScope()
    Using tran = New Transactions.TransactionScope()
        '...
        tran.Complete()
    End Using
End Using

Ancak, ' İşlem yöneticisi uzak / ağ işlemleri için desteğini devre dışı bıraktı. ' Atıldı.

JoinScope açıklaması:

Public Class JoinScope
    Implements IJoinScope
    Implements IDisposable
    '...
End Class

Aynı ortamda başka bir uygulamada bu şekilde sorunsuz çalıştım ama burada bu sorun var. Sorunu çözmek için ne yapabilirim?


Magnus'un önerdiği adımları, tabiri caizse tüm tabanları kapsadığımdan emin olmak için yaptım ve sonra SQL Server'da clr'yi etkinleştirdiğimi ve bunun benim için işe yaradığını gösteren bir hata almayı başardım. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Yanıtlar:


141

"Dağıtılmış İşlem Koordinatörü" Hizmetinin hem veritabanında hem de istemcide çalıştığından emin olun. Ayrıca, "Ağ DTC Erişimi", "Uzak İstemciye İzin Ver", "Gelen / Giden İzin Ver" ve "İPUCU Etkinleştir" i işaretlediğinizden emin olun.

MS DTC işlemleri için Ağ DTC Erişimini etkinleştirmek için

  1. Bileşen Hizmetleri ek bileşenini açın.

    Bileşen Hizmetleri'ni açmak için Başlat'a tıklayın. Arama kutusuna dcomcnfg yazın ve ardından ENTER tuşuna basın.

  2. Ağ MS DTC Erişimini etkinleştirmek istediğiniz DTC'yi (örneğin Yerel DTC) bulmak için konsol ağacını genişletin.

  3. Eylem menüsünde Özellikler'e tıklayın.

  4. Güvenlik sekmesine tıklayın ve aşağıdaki değişiklikleri yapın: Güvenlik Ayarları'nda Ağ DTC Erişimi onay kutusunu seçin.

    İşlem Yöneticisi İletişimi'nde, Gelene İzin Ver ve Gidene İzin Ver onay kutularını seçin.


3
Teşekkür ederim Magnus. Bu, uygulamanın bir ayarı olmalıdır, çünkü bu tür bir işlem aynı bilgisayarlarla çalıştı, bu da bu sorunun makineyle ilgili olmadığı anlamına gelir.
Lajos Arpad

Evet yaptım. Aynı istisnayı fırlatır.
Lajos Arpad

Sanırım bunun TransactionScope içinde gerçekte yaptığınız şeyle ilgisi var.
Magnus

Ayrıca katılma kapsamına ihtiyacım var çünkü bu işlemin veritabanı sunucusuna tek bir istek olarak gönderilmesini istiyorum.
Lajos Arpad

13
İşlem içindeki tüm veritabanı çağrıları için aynı açık bağlantıyı kullandığınızdan emin olun.
Magnus

11

Bu sorunu ara ara alıyordum, buradaki talimatları ve başka yerlerde çok benzerlerini takip ettim. Hepsi doğru yapılandırıldı.

Bu sayfa: http://sysadminwebsite.wordpress.com/2012/05/29/9/ sorunu bulmama yardımcı oldu.

Temel olarak, her iki sunucuda da MSDTC için yinelenen CID'lerim vardı. HKEY_CLASSES_ROOT \ CID

Bkz: http://msdn.microsoft.com/en-us/library/aa561924.aspx bölümü MSDTC'ye benzersiz bir CID değeri atandığından emin olun

Sanal sunucularla çalışıyorum ve sunucu ekibimiz her sunucu için aynı görüntüyü kullanmayı seviyor. Bu basit bir düzeltme ve yeniden başlatmaya ihtiyacımız yoktu. Ancak DTC hizmetinin Otomatik Başlatma olarak ayarlanması gerekiyordu ve yeniden kurulumdan sonra başlatılması gerekiyordu.


9

"Bağlantılı sunucu" da başka bir mağaza Prosedürünü çağıran bir mağaza prosedürü vardı. Ssms'de çalıştırdığımda tamamdı, ancak uygulamada (Entity Framework) çağırdığımda bu hatayı aldım. Bu makale bana yardımcı oldu ve ben bu komut dosyasını kullandım:

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

daha fazla ayrıntı için şuna bakın: Bağlı sunucu: İş ortağı işlem yöneticisi, uzak / ağ işlemleri için desteğini devre dışı bıraktı


1
Bir çözüme bağlantı memnuniyetle karşılanır, ancak lütfen cevabınızın o olmadan yararlı olduğundan emin olun: Bağlantının etrafına bağlam ekleyin, böylece kullanıcı arkadaşlarınız bunun ne olduğu ve neden orada olduğu konusunda fikir sahibi olurlar, ardından sayfanın en alakalı bölümünü alıntılayın ' hedef sayfanın mevcut olmaması durumunda yeniden bağlanma. Bir bağlantıdan biraz daha fazla olan cevaplar silinebilir.
Petter Friberg

1
Bu sorunumu çözdü, bu yüzden bunu sağladığınız için teşekkür ederiz. Sorunumu düzeltmek için işe yaradığı için neden -1 oy aldığını bilmiyorum.
Boyd P

6

Senaryomda, zaten mevcut bir bağlantıda TransactionScope içinde yeni bir bağlantı örneği oluşturmaya çalıştığım için istisna atılıyordu:

Misal:

void someFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
        {
            someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
        }
    }
}

void someOtherFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        db.Whatever // <- Exception.
    }
}

3

Dan Açıklama cevap : "Eğer işlem içinde tüm veritabanı aramaları için aynı açık bağlantı kullanmak emin olun - Magnus."

Kullanıcılarımız, işlemlerde çalıştığım verilerden ayrı bir veritabanında saklanıyor. Kullanıcıyı almak için db bağlantısını açmak benim için bu hataya neden oluyordu. Diğer db bağlantısını ve kullanıcı aramasını işlem kapsamının dışına taşımak hatayı düzeltti.


1

Aşağıdaki çözümü buraya gönderiyorum çünkü bazı aramalardan sonra burası indiğim yer, diğerleri de olabilir. Bir saklı yordamı çağırmak için EF 6'yı kullanmaya çalışıyordum, ancak benzer bir hatayla karşılaştım çünkü saklı yordamın kullanılan bağlantılı bir sunucusu vardı .

Bağlı sunucu için _ OLE DB sağlayıcısı _ dağıtılmış bir işlem başlatamadığından işlem gerçekleştirilemedi

İş ortağı işlem yöneticisi, uzak / ağ işlemleri için desteğini devre dışı bıraktı *

SQL İstemcisine atlamak sorunumu çözdü, bu da benim için bir EF meselesi olduğunu doğruladı.

EF modeli yöntem tabanlı girişim üretti:

db.SomeStoredProcedure();

ExecuteSqlCommand tabanlı girişim:

db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");

İle:

var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";

connection.Open();
var result = cmd.ExecuteNonQuery();

Bu kod kısaltılabilir, ancak bu sürümün hata ayıklama ve adım adım ilerlemek için biraz daha uygun olduğunu düşünüyorum.

Sql Client'ın mutlaka tercih edilen bir seçim olduğuna inanmıyorum, ancak benzer sorunları olan başka biri google tarafından buraya gelirse bunun en azından paylaşmaya değer olduğunu hissettim.

Yukarıdaki Kod C #, ancak Sql İstemcisine geçmeye çalışma kavramı hala geçerlidir. En azından bunu yapmaya çalışmak tanısal olacaktır.


İlginç. Çözümü VB kodu ile düzenlemek isteyebileceğinizi düşünüyorum (kod çevirmenleri mevcuttur), böylece sorunun etiketleriyle eşleşecektir. Ancak yine de onayladım.
Lajos Arpad


1

Bileşen hizmetlerinde Yerel DTC bulamadıysanız, önce bu PowerShell betiğini çalıştırmayı deneyin:

$DTCSettings = @(
"NetworkDtcAccess",               # Network DTC Access
"NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
"NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
"NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
"NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
"NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
"XaTransactions",                 # Enable XA Transactions
"LuTransactions"                  # Enable SNA LU 6.2 Transactions
)
foreach($setting in $DTCSettings)
{
Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
} 
Restart-Service msdtc

Ve görünüyor!

Kaynak: İş ortağı işlem yöneticisi uzak / ağ işlemleri için desteğini devre dışı bıraktı


0

Başkalarının da aynı sorunu yaşaması durumunda:

Benzer bir hata yaşadım. Bir işlemde birkaç SQL ifadesini sarmaladığım ortaya çıktı, bunlardan biri bağlantılı bir sunucuda yürütüldü (Bir EXEC (...) AT Server deyiminde birleştirme ifadesi). Bağlantılı sunucuya ayrı bir bağlantı açarak sorunu çözdüm, bu ifadeyi bir try ... catch içinde kapsülledikten sonra, yakalama tetiklendiğinde işlemi orijinal bağlantıda iptal ettim.


0

Aynı hata mesajını aldım. Beni değiştirmek için pooling=Falseiçin ;pooling=true;Max Pool Size=200bağlantı dizesinde sorun giderildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.