10 messaggi dal 16 febbraio 2006
Ciao a tutti,
ho un problema sull'utilizzo di più transaction scope annidati.

Ecco la situazione :

      [...]
            using (TransactionScope ts = new TransactionScope())
            {
                if (Save() && Read())
                {
                    ts.Complete();
                    ret = true;
                }
            }
      [...]

        public bool Save()
        {
            using (TransactionScope ts = new TransactionScope())
            {
                [...] //salvo nuovo record
                ts.Complete();
            }
            return true;
        }

        public bool Read()
        {
            bool recordFound = [...] //leggo il nuovo record 
            return recordFound;
        }



Ovviamente ho semplificato la mia situazione comunque il problema é che il metodo Read() non trova il record inserito dal metodo Save().

Utilizzo SQLServer 2005 e sto scrivendo dei record su un solo server e su un solo DB.

Sto sicuramente sbagliando qualcosa di mastodontico ...

Grazie
Luca
10 messaggi dal 16 febbraio 2006
Ok, ci credo che non rispondete in quanto l'esempio che ho postato funziona correttamente... non mi sono spiegato bene.

Credevo che il problema fosse generalizzato... in realtà ho il problema solo se la funzione Save viene fatta da un provider. Nel mio caso é il metodo CreateUser del Membership provider che lancia la creazione di un nuovo utente all'interno della transazione.

La funzione Read legge poi il record appena inserito direttamente sulla tabella del database ma non lo trova.

Per le operazioni di Save e di Read utilizzo la stessa connessione in modo da essere sicuro di non uscire dallo scopo di transazione.

Qualcuno sa se ci sono controindicazioni nell'utilizzo di TransactionScope e MembershipProvider ?

Grazie
Luca
Ciao,

di quale provider parli? Il SqlMembershipProvider di ASP.NET?

Per le operazioni di Save e di Read utilizzo la stessa connessione in modo da essere sicuro di non uscire dallo scopo di transazione.


Forse mi sto perdendo qualcosa, ma mi sembra che il SqlMembershipProvider non consenta di fornire dall'esterno l'istanza della connessione. In ogni caso però, usando il transactionScope non dovrebbe essere un problema.. riesci a specificare il codice con un maggiore dettaglio?
10 messaggi dal 16 febbraio 2006
Grazie della risposta, sto utilizzando un Custom Membership Provider.

Sto costruendo una funzione che permetta di gestire più comodamente i dati dell'utente e quindi nello stesso contesto faccio delle chiamate al mio provider e scritture / letture sul db.

Ho risolto il problema scrivendo direttamente sul db e non utilizzando più il provider... ma é una soluzione temporanea.

Nel mio provider utilizzo lo stesso DAL (tratto dal modulo delle Microsoft Enterprise Library) che uso nella funzione chiamante. Nel DAL viene interrogato il contesto di transazione corrente (System.Transactions.Transaction.Current) e da quello si recupera la connessione.

Seguendo in debug il codice, l'inserimento avviene correttamente e il provider mi restituisce un MembershipUser con i dati che mi aspetto, ma appena il controllo ritorna al metodo chiamante (che ovviamente é in un altro assembly) la lettura fatta direttamente sul DB non trova il record.

Devo ancora fare altre prove tra le quali utilizzare il provider anche per la read...

Per il codice é un po' troppo lungo... Sapete se ProviderBase o MembershipProvider hanno un gestore loro di transazione o qualcosa di simile ?

Grazie ancora
Luca
10 messaggi dal 16 febbraio 2006
 risolto !

Ovviamente non é un problema del transactionscope e neanche del provider, ma un banale errore di logica che portava al provider la chiave di scrittura errata... quindi la lettura non trovava il record perché il provider lo scriveva con una chiave diversa...

chiedo scusa se ho fatto perdere del tempo a qualcuno.

Ciao
Luca

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.