• User Newbie

    TransactionScope

    Ciao a tutti
    Ho un problema con l'uso di TransactionScope.
    Organizzo le classi in questo modo: supponiamo che voglia memorizzare un ordine ed eseguo queste operazioni

    • salvataggio utente
    • salvataggio ordine
      Mi creo una classe per salvare l'utente e una classe per saltare l'ordine. La classe ordine richiama la funzione salva di utente nella sua funzione salva. Se vi verifica un errore nella fase di salvataggio voglio eseguire il rollback. Ho inserito un TransacrionScope in entrambe le funzioni Salva perchè la funzione Salva di utente viene richiamata anche in altre parti del progetto.
      L'avere 2 TransactionScope annidati spesso mi da errore. Mi segnala che TransacrionScope è già utilizzato.
      Suggerimenti su come evitare questo? Alternative a questa organizzazione o all'uso di TransactionScope?
      Grazie mille
    
    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.SalvaUtente();
      if (result)
       scope.Complete();
      else
       scope.Dispose();
    
      return result;
     }
    }
    
    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.SalvaOrdine();
      if (result)
       scope.Complete();
      else
       scope.Dispose();
    
      return result;
     }
    }
    
    

  • Moderatore

    Ciao tedo, benvenuto nel forum.
    Il modo più semplice a mio parere per risolvere il tuo problema è passare alla funzione Salva() della classe utenti il TransactionScope generato nella classe ordini.

    In questo modo puoi continuare ad utilizzare il TS anche se utilizzi la finzione in un altro contesto:

    
    classe utente
    public bool Salva(TransactionScope scope)
    {
      if(scope == null)
      { 
        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.SalvaUtente();  
          if (result)   
            scope.Complete();  
          else   
            scope.Dispose();  
          return result; 
        }
      }
      return Database.SalvaUtente();
    }
    
    

    Prova e aggiusta dove serve, non l'ho testata... Ma credo che la soluzione si annidi in questo tipo di approccio.

    Buon lavoro