SORU
21 Mayıs 2010, Cuma


Hangi şartlar altında bir SqlConnection otomatik olarak ortamdaki Current bir Hareket içinde kayıtlı.

Bu "gönüllü" bir işlem? bir SqlConnection için ne anlama geliyor Sadece bağlantı idam ederim komutlar işlem katılacağı anlamına mı geliyor?

Yani, ne şartlar altında olursa bir SqlConnectionotomatik olarakbir ortam Hareket Current? askere yazılmış

Kodu yorum sorular. Her sorunun cevabı için benim tahminim parantez içinde her bir soru izler.

Senaryo 1: bir hareket İÇİNDE bağlantıları kapsam Açılıyor

using (TransactionScope scope = new TransactionScope())
using (SqlConnection conn = ConnectToDB())
{   
    // Q1: Is connection automatically enlisted in transaction? (Yes?)
    //
    // Q2: If I open (and run commands on) a second connection now,
    // with an identical connection string,
    // what, if any, is the relationship of this second connection to the first?
    //
    // Q3: Will this second connection's automatic enlistment
    // in the current transaction scope cause the transaction to be
    // escalated to a distributed transaction? (Yes?)
}

Senaryo 2: DIŞARIYA açılan bir işlem kapsamı İÇİNDE Kullanarak bağlantıları

//Assume no ambient transaction active now
SqlConnection new_or_existing_connection = ConnectToDB(); //or passed in as method parameter
using (TransactionScope scope = new TransactionScope())
{
    // Connection was opened before transaction scope was created
    // Q4: If I start executing commands on the connection now,
    // will it automatically become enlisted in the current transaction scope? (No?)
    //
    // Q5: If not enlisted, will commands I execute on the connection now
    // participate in the ambient transaction? (No?)
    //
    // Q6: If commands on this connection are
    // not participating in the current transaction, will they be committed
    // even if rollback the current transaction scope? (Yes?)
    //
    // If my thoughts are correct, all of the above is disturbing,
    // because it would look like I'm executing commands
    // in a transaction scope, when in fact I'm not at all, 
    // until I do the following...
    //
    // Now enlisting existing connection in current transaction
    conn.EnlistTransaction( Transaction.Current );
    //
    // Q7: Does the above method explicitly enlist the pre-existing connection
    // in the current ambient transaction, so that commands I
    // execute on the connection now participate in the
    // ambient transaction? (Yes?)
    //
    // Q8: If the existing connection was already enlisted in a transaction
    // when I called the above method, what would happen?  Might an error be thrown? (Probably?)
    //
    // Q9: If the existing connection was already enlisted in a transaction
    // and I did NOT call the above method to enlist it, would any commands
    // I execute on it participate in it's existing transaction rather than
    // the current transaction scope. (Yes?)
}

CEVAP
21 Mayıs 2010, Cuma


Kimse cevap beri bu soruyu beri bazı testler yaptım ve tek başıma değil, tüm cevaplar en bulundu. Bana eğer bir şey özledim eğer bildirin.

Q1."Askere=false" belirtilen bağlantı dizesi. sürece Evet Bağlantı havuzu kullanılabilir bir bağlantı bulur. Kullanılabilir bir bağlantı, bir hareket ya da aynı hareket içinde kayıtlı bir içinde kayıtlı değil.

S2.İkinci bağlantı aynı işleme katılan bağımsız bir bağlantı vardır. Emin değilim ile ilgili etkileşim komutları bu iki bağlantıları, beri kaçıyorlar karşı aynı veritabanı ama bence hataları oluşabilir komutları verilir hem de aynı anda: hataları gibi "Transaction context in use by another session"

Q3.Evet, olur kızıştı için bir dağıtılmış işlem, yani kaydetme birden fazla bağlantı, hatta aynı bağlantı dizesini neden olmak için bir dağıtılmış işlem, teyit tarafından kontrol edilmesi için bir boş olmayan bir GUID İşlem.Mevcut.Transactionİnformation.Distributedİdentifier. *Güncelleme: okudum bir yerde bu sabit SQL Server 2008, MSDTC değil kullanılan aynı bağlantı dizesi kullanılır için her iki bağlantı (her iki bağlantı açık değil, aynı zamanda). Sen bir bağlantı açın ve mümkün olduğunca geç bağlantı açmak ve en kısa sürede onları kapatarak bağlantı havuzu kullanmak daha iyi olabilecek bir işlem içinde birden çok kez kapatmak için izin verir.

S4.Hayır. Bir bağlantı hiçbir işlem kapsamında aktif açıldığında, otomatik olarak yeni oluşturulan bir işlem kapsamı içinde kayıtlı olacak.

S5.Hayır. İşlem bağlantısı dürbün aç veya kapsamında varolan bir bağlantı Listeleme sürece, temelde HAREKET YOK. Bağlantınızı otomatik olarak veya komutlar işlem katılmak için elle sırada işlem kapsamında kayıtlı olması gerekir.

Soru 6.Evet, bir bağlantı, bir işlemde değil katılan komutları kodu geri aldım bu işlem kapsam blok idam gerçekleşiyor olsa da yayınlanan kararlılar. Eğer bağlantı değil kayıtlı mevcut hareket kapsam, değil katılan hareket, işleyen veya geri hareket edecek bir etkisi yoktur komutları verilen bir bağlantı askere hareket kapsamında... this guy found out. Bu otomatik kayıt işlemi anlamak sürece nokta gerçekten çok zor bir bağlantı açılır . sadece oluşur ^em>içindeetkin bir işlem kapsamı.

S7.Evet. Varolan bir bağlantıyı açıkça EnlistTransaction( İşlem.çağırarak geçerli işlem kapsamı içinde kayıtlı olabilir Geçerli ). Ayrıca askere bağlantısı üzerinde ayrı bir iş parçacığı, işlem kullanarak bir DependentTransaction, ama eskisi gibi, nasıl emin değilim iki bağlantı dahil aynı işlem karşı aynı veritabanı olabilir etkileşim... ve hataları ortaya çıkabilir, ve tabii ki ikinci askere bağlantı neden hareket yükselmek için bir dağıtılmış işlem.

Soru 8.Bir hata oluştu. TransactionScopeOption.Gerekli kullanıldı ve Bağlantı oldu zaten kayıtlı bir hareketi kapsamında işlem çıktı, sonra hiçbir hata; aslında, orada yeni bir hareket yarattı kapsamını ve işlem sayısı (@@trancount) artmaz. Eğer, ancak, TransactionScopeOption kullanın.RequiresNew, o zaman yeni bir hareket kapsamında hareket bağlantı askere denemeden sonra yararlı bir hata iletisi alırsınız: "Bağlantı şu anda işlem başvurmuştu. Geçerli işlem bitiş ve yeniden deneyin." Ve evet, bağlantı hareket içinde kayıtlı tamamlamak, güvenli bir şekilde yeni bir hareket bağlantı Listeleme. Güncelleme: Eğer daha önce aradı BeginTransaction ilgili bağlantı, bir biraz farklı bir hata atılır çalıştığınızda askere yeni bir hareket kapsamında işlem: "askere hareket çünkü yerel bir işlem devam etmekte olan bağlantısını. Yerel işlem bitiş ve yeniden deneyin." Diğer taraftan, güvenli bir şekilde aramak BeginTransaction üzerinde SqlConnection çalışırken, bir yandan da gönüllü bir hareket kapsamında işlem, ve o gerçekten artış @@trancount, aksine kullanarak Gerekli seçeneği, Bir iç içe geçmiş hareket kapsamı, hangi değil neden artırın. İlginçtir ki, eğer o zaman hadi oluşturmak için başka bir iç içe geçmiş hareket kapsamı ile Gerekli seçenek, sen-ecek değil almak bir hata, çünkü hiçbir şey değişiklikler sonucunda zaten sahip aktif hareket kapsamında işlem (hatırla @@trancount değil artan bir hareket kapsamında işlem zaten aktif ve Gerekli seçeneği kullanılır).

S9.Evet. Komutları bağlantı aktif işlem kapsamı C ne olursa olsun askere ne olursa olsun katılmak# kodu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007
  • PamtheBlamofficial

    PamtheBlamof

    31 Aralık 2010
  • stewmurray47

    stewmurray47

    1 Kasım 2006