TransactionScope

tedo

Nuovo Utente
10 Dic 2014
2
0
0
Ciao a tutti
Come gestire il rollback in un'applicazione asp.net?
Vi spiego come organizzo le classi: per esempio, se devo memorizzare un ordine le fasi che eseguo sono
- salvataggio utente
- salvataggio ordine
Per far questo creo una classe utente con una funzione salva e una classe ordine con una funzione salva che permette di salvare l'ordine. La funzione salva di ordine richiama anche il salva di utente.
Nel caso si verifichi un errore vorrei eseguire il rollback.
Per far questo utilizzo 'TransactionScope'. Il problema è che se uso 'TransactionScope' sia in nel salva di utenet e sia in salva di ordini, ricevo un errore sul 'TransactionScope'. Sembra che non mi permetta di definire 'TransactionScope' annudati. Come evitare questo o altre soluzioni?

classe utente
public bool Salva
{
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
transactionOptions.Timeout = new TimeSpan(0, 5, 0);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
bool result = Database.Salva();
if (result)
scope.Complete();
else
scope.Dispose();
}
}

classe ordini
public bool Salva
{
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
transactionOptions.Timeout = new TimeSpan(0, 5, 0);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
bool result = utente.Salva();

result &= Database.Salva();

if (result)
scope.Complete();
else
scope.Dispose();
}
}
 

Vins

Moderatore
Membro dello Staff
MOD
28 Lug 2009
238
19
0
Ciao, il modo più semplice di gestire il rollback è il seguente

Codice:
SqlTransaction tr = /*Definizione*/

try
{
/*Assegnare ad ogni table adapter o command la connessione*/

/*Esecuzione dei command*/

tr.Commit();

}
catch(Exception ex)
{
	if (tr != null)
            tr.Rollback();
}