TransactionScope işlemleri nasıl geri alır?


101

Bir veritabanına birkaç nesne ekleyeceğim ve ardından yöntemimin bu nesneleri alıp almadığından emin olacağım bir entegrasyon testi yazıyorum.

Veritabanına bağlantım NHibernate üzerinden ... ve böyle bir testi oluşturmak için benim genel yöntemim aşağıdakileri yapmak olacaktır:

NHibernateSession.BeginTransaction();

//use nhibernate to insert objects into database
//retrieve objects via my method
//verify actual objects returned are the same as those inserted

NHibernateSession.RollbackTransaction();

Bununla birlikte, son zamanlarda görünüşe göre bu amaç için kullanılabilecek TransactionScope'u öğrendim ...

Bulduğum bazı örnek kodlar aşağıdaki gibidir:

public static int AddDepartmentWithEmployees(Department dept)
{

    int res = 0;

    DepartmentAdapter deptAdapter = new DepartmentAdapter();
    EmployeeAdapter empAdapter = new EmployeeAdapter();
    using (TransactionScope txScope = new TransactionScope())
    {

        res += deptAdapter.Insert(dept.DepartmentName);
        //Custom method made to return Department ID 
        //after inserting the department "Identity Column"
        dept.DepartmentID = deptAdapter.GetInsertReturnValue();
        foreach(Employee emp in dept.Employees)
        {

            emp.EmployeeDeptID = dept.DepartmentID;
            res += empAdapter.Insert(emp.EmployeeName, emp.EmployeeDeptID);

        }
        txScope.Complete();

    }
    return res;

}

İnanıyorum ki txScope.Complete(), girilen verilerin geri alınacağı satırı dahil etmezsem. Ama ne yazık ki bu yok nasıl ... nasıl mümkün olduğunu anlamıyorum txScopenesne takip deptAdapterve empAdapternesneler ve veritabanı üzerinde kendi işlemlerini.

Burada biraz bilgi eksikmişim gibi hissediyorum ... BeginTransaction()ve RollbackTransaction() aramalarımı kodumu kullanarak değiştirebilir TransactionScopemiyim?

Değilse, TransactionScopeişlemleri geri almak için nasıl çalışır?


NHibernate'i hiç kullanmadım ama belki bu bağlantı size yardımcı olabilir.

İşlemleri işlemlere ayırmak için NHibernate oturumlarınızı yönetmenin daha iyi bir yolunu arıyorsanız, bu konuyla ilgili blog yazıma göz atmak isteyebilirsiniz dotnetchris.wordpress.com/2009/01/27/…
Chris Marisic

Yanıtlar:


109

Esasen TransactionScope Adaptörünüzü izlemez, yaptığı şey veritabanı bağlantılarını izlemektir. Bir DB bağlantısını açtığınızda, bağlantılar bir ortam işlemi (İşlem Kapsamı) olup olmadığını ve varsa onunla birlikte kayıt olup olmadığına bakar. Dikkat, aynı SQL sunucusuna birden fazla bağlantı varsa, bu bir Dağıtılmış İşleme yükseltilecektir.

Bir kullanım bloğu kullandığınızdan bu yana olan, bir istisna olsa bile imha etme çağrısı yapılacaktır. Dolayısıyla, dispose txScope.Complete () 'den önce çağrılırsa, TransactionScope bağlantılara işlemlerini (veya DTC'yi) geri almalarını söyleyecektir.


10
TransactionScope, iş parçacığı üzerindeki mevcut İşlem dışında hiçbir şeyi takip etmez ve modele dayalı olması gerekiyorsa onu değiştirir (gerektirir, yeni gerektirir, vb.). İşlem, sadece veritabanı bağlantılarını değil, onunla ilgili her şeyi bildirir.
casperOne

1
Sanırım bu tamamen doğru değil. TransactionScope kaynak kodunun kısmi bir izini yaptım ve ayrıca şu msdn.microsoft.com/en-us/library/ms172152(v=vs.90).aspx "İşlemi oluşturmadıysa, commit, CommittableTransaction nesnesinin sahibi tarafından her çağrıldığında gerçekleşir. Bu noktada, Transaction Manager kaynak yöneticilerini çağırır ve onları Complete yönteminin TransactionScope nesnesinde çağrılıp çağrılmadığına bağlı olarak commit veya geri alma konusunda bilgilendirir. " Kaynak izi de bu davranışı gösterir.
user44298


Benim için hala net değil. İşlem kapsamında çağrılan yöntemlere sahip nesnelerin İşlem mekanizması ile işbirliği yapması gerektiği görülmektedir. Sistem tarafından Taahhüt / Geri Alma bildirimlerini aramalılar ve gerektiğinde geri alma işlemini gerçekleştirecek kişiler oldukları için kendilerini geri alabilmeliler (eğer bir dosya silme işlemi gerçekleştirildiyse, tabii ki, almadıkça sihirli bir şekilde geri alamayız) bazı ihtiyati tedbirler). Görünüşe göre SQL sunucu işlemleri işbirliğine dayalı. Ancak .Net'te başka ortak bir nesne var mı? İşbirlikçi bir sınıf nasıl yazılır? Belgeler mi?
dakika

54

TransactionScopeSınıf ile çalışır Transactionsınıfın parçacığı özeldir.

Ne zaman TransactionScopeoluşturulur, bu olup olmadığını denetler Transactionparçacığı için; eğer varsa o zaman bunu kullanır, aksi takdirde yeni bir tane yaratır ve onu yığının üzerine iter.

Mevcut olanı kullanıyorsa, yalnızca sürümler için bir sayacı artırır (çünkü onu aramanız Disposegerekir). Son sürümde, Transactiontamamlanmamışsa, tüm işi geri alır.

Sınıfların neden işlemleri sihirli bir şekilde biliyor gibi göründüğüne gelince, bu, bu modelle çalışmak isteyen sınıflar için bir uygulama ayrıntısı olarak bırakılmıştır.

Eğer oluştururken deptAdapterve emptAdapterörneklerini, bunlar iplik (statik güncel bir işlem olup olmadığını görmek için kontrol Currentmülkiyet üzerinde Transactionsınıfından). Varsa, kendini Transactionteslim etme / geri alma sırasına katılmak için ( Transactionçekirdek, dağıtılmış vb. Gibi çeşitli işlem koordinatörlerini kontrol eder ve bunlara yayılabilir) ile kaydolur .


4
Kapsam dahilinde oluşturulan SqlConnection (lar) ile nasıl çalışır? SqlConnection sınıfı, sırayla TransactionScope'a dahil olan Transaction sınıfını dahili olarak kullanıyor mu? Yoksa doğrudan TLS'ye mi kayıt oluyor?
Kakira
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.