Aracılığıyla paylaş


Tek Aşamalı ve Çok Aşamalı İşlem Gerçekleştirme

Bir işlemde kullanılan her kaynak, eylemleri bir işlem yöneticisi (TM) tarafından koordine edilen bir kaynak yöneticisi (RM) tarafından yönetilir. Kaynakları bir İşlemde Katılımcı Olarak Listeleme konusu, bir kaynağın (veya birden çok kaynağın) bir işleme nasıl kaydedilebileceğini açıklar. Bu konu başlığında, işlem taahhüdünün listelenmiş kaynaklar arasında nasıl koordine edilebileceği açıklanmaktadır.

İşlemin sonunda uygulama, işlemin işlenmesini veya geri alınmasını ister. İşlem yöneticisinin, bazı kaynak yöneticilerinin işlemeye oy verirken diğerlerinin işlemi geri almak için oy vermesi gibi riskleri ortadan kaldırması gerekir.

İşleminiz birden fazla kaynak içeriyorsa, iki aşamalı işleme (2PC) gerçekleştirmeniz gerekir. İki aşamalı işleme protokolü (hazırlama aşaması ve işleme aşaması), işlem sona erdiğinde tüm kaynaklarda yapılan tüm değişikliklerin tamamen işlendiğinden veya tamamen geri alındığından emin olur. Tüm katılımcıları sonra sonucunu bildirilir. İki aşamalı işleme protokolünün ayrıntılı bir tartışması için lütfen Jim Gray'in "İşlem İşleme : Kavramlar ve Teknikler (Veri Yönetimi Systems'da Morgan Kaufmann Serisi) ISBN:1558601902" kitabına bakın.

Tek Aşamalı İşleme protokolüne katılarak da işleminizin performansını iyileştirebilirsiniz. Daha fazla bilgi için bkz . Tek Aşamalı İşleme kullanarak iyileştirme ve Tanıtılabilir Tek Aşamalı Bildirim.

Yalnızca bir işlemin sonucu hakkında bilgi almak ve oylamaya katılmak istemiyorsanız etkinliğe kaydolmanız TransactionCompleted gerekir.

İki aşamalı kayıt (2PC)

İlk işlem aşamasında, işlem yöneticisi bir işlemin işlenmesi mi yoksa geri alınması mı gerektiğini belirlemek için her kaynağı sorgular. İkinci işlem aşamasında, işlem yöneticisi sorgularının sonucunu her kaynağa bildirir ve gerekli temizleme işlemlerini gerçekleştirmesini sağlar.

Bu tür bir işleme katılmak için, kaynak yöneticisinin IEnlistmentNotification 2PC sırasında TM tarafından bildirim olarak çağrılan yöntemleri sağlayan arabirimi uygulaması gerekir. Aşağıdaki örnek, bu tür uygulaması örneği gösterir.

class myEnlistmentClass : IEnlistmentNotification
{
    public void Prepare(PreparingEnlistment preparingEnlistment)
    {
        Console.WriteLine("Prepare notification received");

        //Perform transactional work

        //If work finished correctly, reply prepared
        preparingEnlistment.Prepared();

        // otherwise, do a ForceRollback
        preparingEnlistment.ForceRollback();
    }

    public void Commit(Enlistment enlistment)
    {
        Console.WriteLine("Commit notification received");

        //Do any work necessary when commit notification is received

        //Declare done on the enlistment
        enlistment.Done();
    }

    public void Rollback(Enlistment enlistment)
    {
        Console.WriteLine("Rollback notification received");

        //Do any work necessary when rollback notification is received

        //Declare done on the enlistment
        enlistment.Done();
    }

    public void InDoubt(Enlistment enlistment)
    {
        Console.WriteLine("In doubt notification received");

        //Do any work necessary when in doubt notification is received

        //Declare done on the enlistment
        enlistment.Done();
    }
}
Public Class EnlistmentClass
    Implements IEnlistmentNotification

    Public Sub Prepare(ByVal myPreparingEnlistment As PreparingEnlistment) Implements System.Transactions.IEnlistmentNotification.Prepare
        Console.WriteLine("Prepare notification received")

        'Perform transactional work

        'If work finished correctly, reply with prepared
        myPreparingEnlistment.Prepared()
    End Sub

    Public Sub Commit(ByVal myEnlistment As Enlistment) Implements System.Transactions.IEnlistmentNotification.Commit
        Console.WriteLine("Commit notification received")

        'Do any work necessary when commit notification is received

        'Declare done on the enlistment
        myEnlistment.Done()
    End Sub

    Public Sub Rollback(ByVal myEnlistment As Enlistment) Implements System.Transactions.IEnlistmentNotification.Rollback
        Console.WriteLine("Rollback notification received")

        'Do any work necessary when rollback notification is received

        'Declare done on the enlistment
        myEnlistment.Done()
    End Sub

    Public Sub InDoubt(ByVal myEnlistment As Enlistment) Implements System.Transactions.IEnlistmentNotification.InDoubt
        Console.WriteLine("In doubt notification received")

        'Do any work necessary when in doubt notification is received

        'Declare done on the enlistment
        myEnlistment.Done()
    End Sub
End Class

Aşama (Aşama 1) hazırla

Uygulamadan bir Commit istek aldıktan sonra işlem yöneticisi, her kaynağın işlem üzerinde oylarını almak için her bir listeye alınan kaynakta yöntemini çağırarak Prepare tüm listeye alınan katılımcıların Hazırlama aşamasına başlar.

Uygular, Kaynak Yöneticisi IEnlistmentNotification arabirimi ilk uygulayan Prepare(PreparingEnlistment) yöntemi aşağıdaki basit örnekte gösterildiği gibi.

public void Prepare(PreparingEnlistment preparingEnlistment)  
{  
     Console.WriteLine("Prepare notification received");  
     //Perform work  
  
     Console.Write("reply with prepared? [Y|N] ");  
     c = Console.ReadKey();  
     Console.WriteLine();  
  
     //If work finished correctly, reply with prepared  
     if ((c.KeyChar == 'Y') || (c.KeyChar == 'y'))  
     {  
          preparingEnlistment.Prepared();  
          break;  
     }  
  
     // otherwise, do a ForceRollback  
     else if ((c.KeyChar == 'N') || (c.KeyChar == 'n'))  
     {  
          preparingEnlistment.ForceRollback();  
          break;  
     }  
}  

Dayanıklı kaynak yöneticisi bu çağrıyı aldığında, işlemin kurtarma bilgilerini (özelliği alarak RecoveryInformation kullanılabilir) ve işleme sırasında işlemi tamamlamak için gereken bilgileri günlüğe kaydetmesi gerekir. Bu içinde yapılması gerekmez Prepare yöntemi olduğundan RM iş parçacığı üzerinde bunu yapabilirsiniz.

RM bittiğinde kendi iş hazırlama, yürütme veya geri çağırarak için oy Prepared veya ForceRollback yöntemi. Dikkat PreparingEnlistment sınıfından devralan bir Done yönteminden Enlistment sınıfı. Hazırlama aşamasında geri aramada PreparingEnlistment bu yöntemi çağırırsanız, TM'ye salt okunur bir liste olduğunu (işlem korumalı verileri okuyabilen ancak güncelleştiremeyen kaynak yöneticileri) bildirir ve RM, işlemin 2. aşamasındaki sonucu hakkında işlem yöneticisinden başka bildirim almaz.

Uygulamaya, tüm kaynak yöneticileri oy Preparedverdikten sonra işlemin başarılı taahhüdü anlatılır.

Aşama (Aşama 2) Kaydet

İşlemin ikinci aşamasında, işlem yöneticisi tüm kaynak yöneticilerinden başarılı hazırlıklar alırsa (1. aşamanın sonunda tüm kaynak yöneticileri çağırıldı Prepared ), her kaynak yöneticisi için yöntemini çağırır Commit . Kaynak yöneticileri ardından değişiklikleri kalıcı yapın ve yürütme tamamlayın.

Herhangi bir kaynak yöneticisi 1. aşamada hazırlanma hatası bildirdiyse, işlem yöneticisi her kaynak yöneticisi için yöntemini çağırır Rollback ve uygulamaya işlemenin başarısız olduğunu gösterir.

Bu nedenle, kaynak yöneticisi aşağıdaki yöntemleri uygulamanız gerekir.

public void Commit (Enlistment enlistment)  
{  
     // Do any work necessary when commit notification is received  
  
     // Declare done on the enlistment  
     enlistment.Done();  
}  
  
public void Rollback (Enlistment enlistment)  
{  
     // Do any work necessary when rollback notification is received  
  
     // Declare done on the enlistment
     enlistment.Done();
}  

RM, bildirim türüne göre işlemi tamamlamak için gereken tüm işleri gerçekleştirmeli ve parametresinde Enlistment yöntemini çağırarak Done TM'ye tamamlandığını bildirmelidir. Bu iş iş parçacığı üzerinde yapılabilir. Satır içi çağrılır aynı iş parçacığı üzerinde Aşama 2 bildirimleri oluşabilir Not Prepared yönteminde Aşama 1. Bu nedenle, sonra herhangi bir iş yapmanız gerektiğini değil Prepared Aşama 2 bildirimleri almadan önce tamamladınız beklediğiniz araması (örneğin, serbest bırakma kilitler).

Nin şüpheli işlemi olmadığından uygulama

Son olarak, uygulamalıdır InDoubt geçici kaynak yöneticisi için yöntem. İşlem yöneticisinin bir veya daha fazla katılımcıyla iletişimini kaybetmesi durumunda bu yöntem çağrılır, bu nedenle durumları bilinmez. Bu durumda, işlem katılımcılarından herhangi birinin tutarsız bir durumda bırakılıp bırakılmadığını daha sonra araştırabilmeniz için bu olguyu günlüğe kaydetmeniz gerekir.

public void InDoubt (Enlistment enlistment)  
{  
     // log this  
     enlistment.Done();  
}  

Tek aşaması yürütme en iyi hale getirme

Tüm güncelleştirmeleri herhangi bir açık işbirliği yapıldığından tek aşaması yürütme Protokolü çalışma zamanında daha etkilidir. Bu protokol hakkında daha fazla bilgi için bkz . Tek Aşamalı İşleme kullanarak iyileştirme ve Tanıtılabilir Tek Aşamalı Bildirim.

Ayrıca bkz.