SORU
6 Kasım 2009, Cuma


Current otomatik olarak bazı makinelerde MSDTC için tırmanan?

Projemizde Current veri Erişim Katmanı bir işlem eylemleri bunu yapar sağlamak için kullanıyoruz. İçin hedefliyoruzdeğilMSDTC hizmeti son kullanıcı bizim üzerinde etkin olmasını gerektirir makineleri.

Sorun, geliştiriciler bizim makinelerin yarısı, MSDTC devre ile çalıştırabilirsiniz. Diğer yarısı da etkin olması gerekir ya"[SUNUCU] MSDTC kullanılamaz"hata iletisi.

Gerçekten başım beni kaşıma var ve beni ciddiye home-end Current gibi bir çözüm, geri düşünürsek ADO.NET işlem nesneleri dayalı vardır. Görünüşte delilik - (yükselmek) bizim geliştirici yarısı üzerinde çalışıyor aynı kodyokdiğer geliştirici üzerinde yükselmek.

http://stackoverflow.com/questions/506733/ daha iyi bir cevap umuyordum ama ne yazık ki değil.

İşte sorun yaratacak bir kod örneği biraz tırmandırmaya çalışan makinelerde, ikinci bağlantıda yükselmek için çalışır.() Açık (ve evet, diğer bağlantı sırasında açık yoktur.)

using (TransactionScope transactionScope = new TransactionScope() {
   using (SqlConnection connection = new SqlConnection(_ConStr)) {
      using (SqlCommand command = connection.CreateCommand()) {
         // prep the command
         connection.Open();
         using (SqlDataReader reader = command.ExecuteReader()) {
            // use the reader
            connection.Close();
         }
      }
   }

   // Do other stuff here that may or may not involve enlisting 
   // in the ambient transaction

   using (SqlConnection connection = new SqlConnection(_ConStr)) {
      using (SqlCommand command = connection.CreateCommand()) {
         // prep the command
         connection.Open();  // Throws "MSDTC on [SERVER] is unavailable" on some...

         // gets here on only half of the developer machines.
      }
      connection.Close();
   }

   transactionScope.Complete();
}

Gerçekten iyi direniyor ve bunu çözmeye çalıştık. İşte çalışır bu makineler hakkında bazı bilgiler:

  • Dev 1: Windows 7 x 64 SQL2008
  • Dev 2: Windows 7 86 SQL2008
  • Dev 3: Windows 7 x 64SQL2005SQL2008

Geliştiriciler işe yaramaz:

  • Dev 4: Windows 7 x 64SQL2008SQL2005
  • Dev 5: Windows Vista x 86, SQL2005
  • Dev 6: Windows XP X 86, SQL2005
  • Benim Ev PC : Windows Vista Home Premium, 86, SQL2005

Tüm makineler, sorun avlamak için bir çaba içinde, tam olarak Microsoft Update sitesinden her şeyi yamalı edildiğini eklemek gerekir.

Güncelleme 1:

Bu işlem için yükseltme sayfası aşağıdaki koşulları bir işlem DTC tırmandırmaya neden olacak Birleşik Devletleri MSDN:

  1. Tek fazlı bildirimleri desteklemiyor en az bir sağlam kaynak hareket içinde kayıtlı.
  2. Tek fazlı bildirimleri destekleyen en az iki sağlam kaynakları hareket içinde kayıtlı. Örneğin, tek bir bağlantı ile kaydetme bir işlem tanıtımını neden olmaz. Bir veritabanı askere neden ikinci bir bağlantı açtığınızda, ancak Sistem.Hareketleri altyapı işlemde ikinci sürekli kaynak ve bir MSDTC işlem düzeyine algılar.
  3. "Etki alanı veya farklı bir başvuru süreci için işlem çağrılır. "Şerif isteği Örneğin, işlem seri hale getirme, uygulama etki alanı sınırları boyunca nesne. İşlem nesne tarafından değeri sıralanmış, uygulama etki alanı sınırı (hatta aynı süreçte) üzerinden geçmek için herhangi bir girişimde işlem seri hale getirme nesne sonuçlar anlamına gelir. Parametre olarak bir Hareket alır uzak bir yöntem çağrısı yaparak hareket nesneleri iletebilirsiniz veya İşlem-hizmet uzaktan bir bileşeni erişmek için deneyebilirsiniz. Bu işlem uygulama etki alanı üzerinde seri olarak hareket, bir gerginlik nesne ve sonuçları ciddi,. Dağıtılıyor ve yerel hareket Yöneticisi Artık yeterli değildir.

#3 yaşıyoruz. #2 Hiç bir zaman bir bağlantı var çünkü olmuyor, ve de bir tek 'sağlam kaynak'. #1 oluyor olabilir herhangi bir yolu var mı? Tek fazlı bildirimleri destek vermeme neden olan SQL2005/8 yapılandırma biraz?

Güncelleme 2:

Yeniden araştırılması, şahsen, herkes SQL Server sürümleri - "aslında" Dev 4 "aslında SQL2005. SQL2008 ve" Dev 3 O beni asla arkadaşlarımı tekrar güvenmeyi öğretir. ;) Verileri bu değişiklik nedeniyle, bu bizim sorunumuz bulduk eminim. SQL2008 bizim geliştiriciler SQL2008 SQL2005 olmayan müthiş içerdiği bol miktarda olduğundan sorun yaşıyor değildi.

O da söylüyor bu yüzden olacağız destekleyen SQL2005 biz can't use Current gibi oldu, ve eğer istediğimiz için kullanmak Current ihtiyacımız olacak geçen tek bir SqlConnection nesnesi etrafında... ... gibi sorunlu durumlarda SqlConnection olmaz kolay etrafında geçti...sadece kokuyor küresel-SqlConnection örneği. Pew!

Güncelleme 3

Burada söz konusu netleştirmek için:

SQL2008:

  • Tek bir Current içinde birden fazla bağlantı (yukarıdaki örnek kodda gösterildiği gibi.) sağlar
  • Uyarı #1: Eğer bu birden fazla SqlConnections iki veya daha fazla SqlConnections aynı anda açılır, yani, iç içe, Current hemen DTC artacak.
  • Eğer ek bir SqlConnection farklı açıldı . uyarı #2: >em ^'sağlam kaynak'hemen DTC için yükselmek olacaktır (örn: farklı bir SQL Server)

SQL2005:

  • Tek bir Current içinde birden fazla bağlantıya izin vermiyor, nokta. Eğer ikinci bir SqlConnection açıldı/zaman yükselmek olacaktır.

Güncelleme 4

Bu soru daha yapma çıkarınabir karmaşakullanışlı, ve sadece daha fazla açıklık aşkına, burada bir DTC ile görüşmek için SQL2005 alabilirsiniztekSqlConnection:

using (TransactionScope transactionScope = new TransactionScope()) {
   using (SqlConnection connection = new SqlConnection(connectionString)) {
      connection.Open();
      connection.Close();
      connection.Open(); // escalates to DTC
   }
}

Bu sadece benim için kırık gibi görünüyor, ama eğer 5 ** Her ara bağlantı havuzundan kapma ise anlayabilirim sanırım.

"Neden bu halde olabilir?"Eğer açıldığında önce bu bağlantı karşı bir SqlTableAdapter kullanırsanız, SqlTableAdapter ve bağlantıyı kapatmak, etkili bir şekilde şimdi olmaz çünkü işlem bittikten yeniden açılacaktır.

Yani, temelde, başarılı bir şekilde kullanmak Current ile SQL2005 yapmamız gereken bir tür küresel bağlantı nesnesi açık kalır noktadan ilk Current örneği kadar artık gerekli. Ayrıca kod-koku küresel bir bağlantı nesnesi, açılış ve kapanış bağlantısı ilk geçen at şeye karşı mantığı açılış bağlantısı gibi geç mümkün ve kapanış en kısa sürede.

CEVAP
7 Kasım 2009, CUMARTESİ


SQL2008 kullanabilir birden fazla SQLConnections TransactionScope olmadan tırmanan, sağlanan bağlantıları olmayan açık aynı anda, hangi neden olacaktır birden çok "fiziksel" TCP bağlantılarını ve böylece yükseltme gerektirir.

Geliştiricilerinin bazıları SQL2005 ve SQL2008 Diğerleri görüyorum. Doğru tırmanan hangi belirledik ve hangi olmadığından emin misin?

En bariz açıklama SQL 2008 ile geliştiriciler artan değil mi olanlar olacaktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • gamingbits

    gamingbits

    2 Mayıs 2006
  • newreleaseblitz

    newreleasebl

    13 Ocak 2010
  • SolidWorksTutoriels

    SolidWorksTu

    14 Kasım 2013