Domanda

Capisco, in modo confuso, come funzionano le normali transazioni ACID.Esegui del lavoro su un database in modo tale che il lavoro non venga confermato finché non viene impostato un qualche tipo di flag di commit.La parte di commit si basa su alcuni presupposti di base (come la scrittura di un singolo blocco su disco è atomica).In caso di errore catastrofico, puoi semplicemente cancellare i dati non salvati nella fase di ripristino.

Come funzionano le transazioni distribuite?In parte della documentazione di MS ho letto che è possibile in qualche modo eseguire una transazione tra database e filesystem (tra le altre cose).

Questa tecnologia potrebbe essere (e probabilmente lo è) utilizzata dagli installatori, dove si desidera che il programma sia completamente installato o completamente assente.Inizi semplicemente una transazione all'avvio del programma di installazione.Successivamente potresti connetterti al registro e al filesystem, apportando le modifiche che definiscono l'installazione.Una volta terminato il lavoro, è sufficiente eseguire il commit o il rollback se l'installazione non riesce per qualche motivo.Il registro e il file system vengono automaticamente puliti per te da questo magico coordinatore delle transazioni distribuite.

Com'è possibile che due sistemi disparati possano essere oggetto di transazioni in questo modo?Mi sembra che sia sempre possibile lasciare il sistema in uno stato incoerente, dove il filesystem ha apportato le sue modifiche e il registro no.Penso che in MSDTC sia persino possibile eseguire una transazione attraverso la rete.

ho letto http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx, ma sembra solo l'inizio della spiegazione e il passaggio 4 dovrebbe essere ampliato notevolmente.

Modificare: Da quello che ho capito http://en.wikipedia.org/wiki/Distributed_transaction, può essere realizzato tramite un commit in due fasi (http://en.wikipedia.org/wiki/Two-phase_commit).Dopo aver letto questo, non ho ancora capito il metodo al 100%, sembra che ci sia molto spazio per errori tra i passaggi.

È stato utile?

Soluzione

Informazioni sul "passaggio 4":

Il gestore delle transazioni si coordina con i gestori delle risorse per garantire che tutti riuscissero a svolgere il lavoro richiesto o nessuno dei lavori se svolto, mantenendo così le proprietà acide.

Ciò ovviamente richiede che tutti i partecipanti forniscano le interfacce adeguate e le implementazioni (prive di errori).L'interfaccia assomiglia vagamente a questa:

public interface ITransactionParticipant {
    bool WouldCommitWork();
    void Commit();
    void Rollback();
}

Il gestore delle transazioni al momento del commit chiede a tutti i partecipanti se sono disposti a impegnare la transazione.I partecipanti possono affermarlo solo se sono in grado di effettuare questa transazione in tutte le condizioni di errore consentite (convalida, errori di sistema, ecc.).Dopo che tutti i partecipanti hanno affermato la capacità di effettuare il commit della transazione, il manager invia il file Commit() messaggio a tutti i partecipanti.Se invece un partecipante segnala un errore o va in timeout, l'intera transazione viene interrotta e i singoli membri vengono ripristinati.

Questo protocollo richiede che i partecipanti abbiano registrato l'intero contenuto della transazione prima di affermare la propria capacità di impegnarsi.Naturalmente questo deve avvenire in una speciale struttura di registro delle transazioni locali per poter eseguire il ripristino da vari tipi di errori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top