2009-06-30 12 views
20

olarak kaydetme Başka birinin bu özel hatası varsa ve nasıl çözüleceğini bilip bilmediğini merak ediyor musunuz? izleyin olarakDağıtılmış işlem tamamlandı. Bu oturumu yeni bir işlemde veya NULL işlemini

senaryo

Biz SQL Server 2008 küme arka uç bağlanırken Windows Server 2008 IIS çiftlikte çalışan Enterprise Library kullanarak bir ASP.NET web uygulaması var ... olduğunu. MSDTC açık. DB bağlantıları havuzlanır.

Şüphelem, satırın herhangi bir yerinde başarısız bir MSDTC işlemi olduğunu, bağlantının havuza geri döndüğünü ve farklı bir sayfada bulunan bir sonraki sorgunun hatalı bağlantıyı bulması ve bu özel hatayı almasıdır. Komik şey, bu hatayı, dağıtılmış işlemle (iki veri tabanına, vs.) gerek olmayan bir sorguda almamızdır. Hata aldığımızda sadece seçme sorgusu (işlem yok) yapıyorduk.

SQL Profiling'i yaptık ve sorgu SQL Server'da çalıştırıldı, ancak hiçbir zaman geri gelmedi (MSDTC işlemi zaten bağlantıda iptal edildiğinden). Bu eşlik edecek

Bazı diğer ilgili hatalar şunlardır: geçerli işlem tanımlayıcısını gelen çünkü

  • Yeni istek başlatmaya izin verilmez.
  • İç .NET Framework veri sağlayıcısı hatası 60.
+0

Bu konuda bir şey buldunuz mu? Daha büyük veri kümelerini eklerken anladım (> 10K satır). – StingyJack

cevap

3

Bir ödül aradığınız cevap almak yardımcı olabilir, ancak muhtemelen bazı kod örnekleri vermek ve daha iyi bir açıklama verirsen daha iyi cevap almak için gidiyoruz hata oluştuğunda.

Hata sadece aralıklı olarak gerçekleşiyor mu? Açıklamanızdan hoşlanıyor.

Microsoft'un önerdiği gibi, using TransactionScope engellemede işlem olarak yapılmasını istediğiniz kapatılıyor mu? Bu garip işlem davranışından kaçınmanıza yardımcı olur. using bloğunun, atılan istisnalar dışında nesnenin her zaman atıldığından emin olmasını hatırlayın. Buraya bakın: eğer,

Using ts As New Transactions.TransactionScope(Transactions.TransactionScopeOption.RequiresNew) 
     ' Do Stuff 
    End Using 

Ayrıca: Eğer TransactionScope kullanıyorsanız http://msdn.microsoft.com/en-us/library/ms172152.aspx

hep bu kod bloğu için yeni bir hareket oluşturmak için bir çerçeve söyleyen bir argüman System.TransactionScopeOption.RequiresNew var Bir bağlantının arızalı olduğundan ve bağlantı havuzuna geri döndüğünden şüpheleniyorsanız, muhtemel çözüm bağlantıyı Try-Catch bloğunda ve Dispose bağlantı bloğu bağlantısındaki bağlantıyı kesebilecek kodları kapsamaktır.

+0

Sadece açıklamak gerekirse, SQL bağlantınızı yalnızca bağlantının hatalı bir duruma geçmesi durumunda elden çıkarmak istediğiniz söylendi; aksi halde bağlantıları birleştiremezsiniz. –

0

Bunu daha önce görmüştüm ve sebep tam olarak düşündüğünüz şeydi. Rice'ın önerdiği gibi, bu sorunu önlemek için db ile ilgili nesneleri doğru şekilde attığınızdan emin olun.

3

MSDTC varsayılan 90 saniye zaman aşımına sahiptir, eğer bir sorgu yürütme bu süre sınırını aşarsa, işlem gerçekleşmeye çalışırken bu hatayla karşılaşırsınız.

+0

Bu benim için oldu! (Bu neden bir downvote olduğundan emin değil.) – Vaccano

1

Eski soru ... ama bu sorunu birkaç gün geçmişti.

Şimdiye kadar iyi bir yanıt bulunamadı. Sadece öğrendiklerimi paylaşmak istedim.

Benim senaryoda birden çok oturum fabrikaları tarafından açılmış birden fazla oturum var. Doğru bir şekilde geri almalı ve beklemeli ve diğer işlemlerin artık aktif olmadığından emin olmalıydım. Görünüşe bakılırsa, onlardan birinin geri çekilmesi herşeyi geri alacaktır.

Ancak, rollback'ler arasında Thread.Sleep() eklendikten sonra, diğerini yapmaz ve geri alma işlemiyle sorun olmaya devam eder. Yöntemi tetikleyen sonraki isabetler, "Yeni isteğin geçerli işlem tanımlayıcısıyla gelmesi gerektiğinden başlatılmasına izin verilmez." hata.

https://gist.github.com/josephvano/5766488

İlgili konular