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.