CommittableTransaction.Commit Metodo

Definizione

Tenta di eseguire il commit della transazione.

public:
 void Commit();
public void Commit ();
member this.Commit : unit -> unit
Public Sub Commit ()

Eccezioni

Commit() viene chiamato in una transazione, che diventa InDoubt.

Viene chiamato Commit() e viene eseguito il rollback della transazione per la prima volta.

Commenti

Quando viene chiamato questo metodo, vengono chiamato tutti gli oggetti registrati per partecipare alla transazione e possono indicare in modo indipendente il voto di eseguire il commit o il rollback della transazione. Se un partecipante vota per eseguire il rollback della transazione, viene eseguito il rollback e questo metodo genera un'eccezione TransactionException . Si tratta di un'occorrenza normale per una transazione e il codice deve rilevare ed elaborare tali eccezioni.

Commit e EndCommit bloccano fino al completamento della prima fase dell'elaborazione delle transazioni. La prima fase termina dopo che tutti i gestori di risorse e gli inserimenti nella transazione hanno votato sul risultato della transazione e ha deciso duramente di eseguire il commit o l'interruzione TransactionManager della transazione. La seconda fase di elaborazione è sempre asincrona. Pertanto, non esiste alcuna garanzia che i dati appena sottoposti a commit dall'interno di una determinata transazione saranno immediatamente disponibili quando non si usa un'altra transazione per visualizzare questi dati.

Poiché questo metodo si blocca fino al completamento della prima fase dell'elaborazione delle transazioni, è consigliabile prestare molta attenzione quando si usa questo metodo in un'applicazione Form (WinForm) Windows oppure può verificarsi un deadlock. Se chiami questo metodo all'interno di un evento WinForm Control (ad esempio, facendo clic su un pulsante) e usa il metodo sincrono Invoke per indirizzare il controllo per eseguire alcune attività dell'interfaccia utente (ad esempio, la modifica dei colori) al centro dell'elaborazione della transazione, si verificherà un deadlock. Ciò è dovuto al fatto che il Invoke metodo è sincrono e blocca il thread di lavoro fino al termine del processo del thread dell'interfaccia utente. In questo scenario, tuttavia, il thread dell'interfaccia utente è anche in attesa del commit della transazione da parte del thread di lavoro. Il risultato è che nessuno è in grado di procedere e l'ambito attende indefinitamente il completamento del commit. È consigliabile usare BeginInvoke anziché Invoke laddove possibile, perché è asincrono e quindi meno soggetto a deadlock.

Si applica a