Sdílet prostřednictvím


Potvrzení transakce v jedné fázi a více fázích

Každý prostředek, který používá v transakci spravuje správce prostředků (SV), jejichž akce jsou koordinovaný správcem transakcí (TM). Zařazení zdrojů jako účastníci v tématu Transakce popisuje, jak lze prostředek (nebo více prostředků) zahrnout do transakce. Toto téma popisuje, jak lze koordinovat mezi zařazených prostředků částku transakce.

Na konci transakce aplikace požádá o transakce, které má být buď potvrzené nebo vrátit zpět. Správce transakcí musí odstranění ohrožení, jako je někteří správci prostředků hlasování se zapsat while ostatním uživatelům hlasování se navrátit transakci.

Pokud vaše transakce zahrnuje více než jeden prostředek, je nutné provést dvoufázového potvrzení (2PC). Protokol dvoufázového potvrzení (fáze prepare a potvrzovací fáze) zajišťuje, že při transakci skončí, všechny změny na všechny zdroje jsou buď zcela potvrzené nebo plně vrácena zpět. Všichni účastníci jsou pak informováni o konečný výsledek. Podrobné informace o dvoufázovém potvrzení protokolu naleznete v knize "Zpracování transakcí : Koncepty a techniky (Morgan Kaufmann Series in Správa dat Systems) ISBN:1558601902" Jim Gray.

Můžete také optimalizovat vaši transakci výkon provedením součást v protokolu jedné fáze potvrzení. Další informace naleznete v tématu Optimalizace pomocí jednofázového potvrzení a propagační jednofázové oznámení.

Pokud jste právě chcete být informováni o výsledek transakce a nechcete, aby se účastnit programu hlasování, byste měli zaregistrovat pro TransactionCompleted události.

Bezdrátové potvrzení (2PC)

V první fázi transakce dotazuje správce transakcí každý zdroj k určení, zda transakce potvrzena nebo vrácena zpět. Správce transakcí upozorní ve druhé fázi transakce každý zdroj výsledku své dotazy, díky kterému jej provést všechny potřebné vyčištění.

K účasti v tento druh transakce, musí implementovat správce prostředků IEnlistmentNotification rozhraní, které poskytuje metody, jež jsou volány správce TM jako oznámení během 2PC. Následující příklad ukazuje příklad tohoto provádění.

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

Připravit fáze (fáze 1)

Při přijímání Commit požadavků z aplikace, správce transakcí začíná Příprava fáze zařazených účastníci voláním Prepare metodu na každý zapsán prostředku, za účelem získání hlas každý zdroj v transakci.

Váš správce prostředků, který implementuje IEnlistmentNotification by měl první implementaci rozhraní Prepare(PreparingEnlistment) jako následující jednoduchý příklad ukazuje metodu.

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;  
     }  
}  

Pokud správce prostředků trvalý obdrží toto volání, ji má protokolovat informace o obnovení transakce (k dispozici načtením RecoveryInformation vlastnost) a libovolné informace, které jsou nezbytné pro dokončení transakce na potvrzení. Toto není nutné provádět v rámci Prepare metoda vzhledem k tomu, že správce prostředků to lze provést v pracovní podproces.

Pokud správce prostředků dokončil jeho připravit pracovní, by měl hlasovat potvrzení nebo vrátit zpět voláním Prepared nebo ForceRollback metody. Všimněte si, že PreparingEnlistment třída dědí Done metody z Enlistment třídy. Pokud tuto metodu lze volat na PreparingEnlistment zpětného volání ve fázi Prepare, informuje správce TM, je jen pro čtení zařazení (to znamená, že správce prostředků, které může číst, ale ochranou transakcí data nelze aktualizovat) a správce prostředků obdrží žádné další oznámení z správce transakcí tak, aby výsledek transakce ve fázi 2.

Aplikace je oznámen úspěšné úsilí transakce po hlasovat, že všechny správce prostředků Prepared.

Potvrzení fáze (fáze 2)

Ve druhém fáze transakce, pokud správce transakcí přijme úspěšné připraví z všechny správce prostředků (uplatnit všechny správce prostředků Prepared na konci fáze 1), vyvolá Commit metodu pro každého správce prostředků. Správci prostředků můžete provést změny trvalý a dokončení potvrzení.

Pokud některý správce prostředků nahlášena chyba připravit ve fázi 1, vyvolá správce transakcí Rollback metodu pro každého správce prostředků a které identifikuje selhání potvrzení do aplikace.

Váš správce prostředků tedy měli používat následující metody.

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();
}  

Správce prostředků by měl provádět každé dílo, které jsou nezbytné pro dokončení transakce v závislosti na typu oznámení a informovat TM, který byl dokončen voláním Done metodu na Enlistment parametru. Tato práce lze provést na pracovní podproces. Všimněte si, že oznámení fáze 2 může dojít, vložený ve stejném vlákně, který volal Prepared metoda ve fázi 1. Jako takové neměli byste každé dílo po Prepared volání (například uvolňující uzamčení), které očekáváte dokončili před přijímala oznámení fáze 2.

Implementace InDoubt

A konečně, měli byste implementovat InDoubt metody pro správce těkavých prostředků. Tato metoda je volána, pokud správce transakcí ztratí kontaktu s jedním nebo více účastníky, tak jejich stav není znám. V takovém případě je zapotřebí přihlásit tuto skutečnost tak, aby si můžete později zjistit, zda některé z účastníci transakce byla ponechána v nekonzistentním stavu.

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

Optimalizace potvrzení jedna fáze

Vzhledem k tomu, že všechny aktualizace jsou provedeno bez explicitního koordinace je efektivnější v době běhu protokol jedné fáze potvrzení. Další informace o tomto protokolu naleznete v tématu Optimalizace pomocí jednofázového potvrzení a promotable jednofázové oznámení.

Viz také