[VB2005] Transazioni

giovedì 10 dicembre 2009 - 11.39

Teech Profilo | Expert

Ho la necessità di lanciare 2 metodi in sequenza, ma se fallisce il secondo deve "fallire" anche il primo. Mi sembra il tipico scenario di utilizzo di una Transazione, ma non ho trovato alcun tutorial che mi spiega come fare: tutti gli esempi che ho trovato riguardano scenari sui Database che implementano già l'uso di transazioni (è sufficiente passare il parametro dove richiesto) ma io ho delle classi di business create da me che attualmente non includono alcun tipo di gestione di transazione (e vorrei implementarle).

Avete indicazioni in merito? Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

luxsor Profilo | Guru

Ciao Maurizio,
per implementare il processo di transazione usa questo piccolo esempio:

Dim myTrans As SqlTransaction
' Avvia la transazione
myTrans = myConnection.BeginTransaction()
myCommand.Transaction = myTrans

Try
'esegui le query

'chiudi la transazione
myTrans.Commit()

Catch e As Exception
Try
'Annulla le modifica apportate
myTrans.Rollback()
Catch ex As SqlException

If Not myTrans.Connection Is Nothing Then
'gestisci se la transazione è ancora in rollback
End If
End Try

Finally
myConnection.Close()
End Try

'Fine

Fammi sapere


------------------------
Luxsor

Teech Profilo | Expert

Per SQL le ho già applicate e funzionano correttamente, il problema è mettere in transazione 2 o più metodi di classi diverse.
Ad esempio:
Class A Sub DoSomthing() End Sub End Class Class B Sub DoSomthing() End Sub End Class Class MyClass Sub Main Dim classA As A Dim classB As B 'Volevo mettere in transazione queste 2 chiamate classA.DoSomeThing classB.DoSomeThing 'Se fallisce il metodo della classe B devo fare il rollback anche per la classe A End Sub End Class
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

luigidibiasi Profilo | Guru

Mi viene in mente una classe tipo factory o comunque una classe master che gestisca l'esecuzione di N classi. (magari salvate in un arraylist)


una cosa del genere :

'interfaccia comune a tutte le classi che devono eseguire qualcosa interface Exec function Exec() as boolean function RollBack() as boolean end interface ' Alcune classi che implementano i due metodi class A implements InterfaceExec function Exec // Codice da eseguire if OK return true else return false end sub sub RollBack // Codice di rollback end sub end class class B implements InterfaceExec function Exec // Codice da eseguire if OK return true else return false end sub sub RollBack // Codice di rollback end sub end class

' La classe master che gestisce l'esecuzione (seriale?)
class Master public ToExec as new ArrayList funtion Execute() dim i as integer for i = 0 to toExec.count -1 if not toExec(i).Exec then RollBack(i) exit function end if next i end function // esegue il rollback delle i classi precedenti function RollBack(i as integer) for j = 0 to i ToExec(j).RollBack next j end function end class

class pgm() sub Main() dim lavoro1 as new A dim lavoro2 as new B dim m as new Master m.ToExec.add(lavoro1) m.toExec.add(lavoro2) m.Execute end sub end class

non so quando sia corretta una cosa del genere....
Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

luxsor Profilo | Guru

Sinceramente non ho mai avuto tale esistenza.

Prova a dichiarare SqlCommand, SqlConnection ecc. (che utilizzi nelle classi) in modo globale.
Quindi utilizza la classe SqlTransaction, prima dell'esecuzione delle tue classi.
Fai in modo che ogni funzione ti restituisca un valore in caso non vada a buon fine, in modo da gestire il rollback del transaction.

Prova e fammi sapere



------------------------
Luxsor

Brainkiller Profilo | Guru

>Ho la necessità di lanciare 2 metodi in sequenza, ma se fallisce
>il secondo deve "fallire" anche il primo. Mi sembra il tipico
>scenario di utilizzo di una Transazione, ma non ho trovato alcun
>tutorial che mi spiega come fare: tutti gli esempi che ho trovato
>riguardano scenari sui Database che implementano già l'uso di
>transazioni (è sufficiente passare il parametro dove richiesto)
>ma io ho delle classi di business create da me che attualmente
>non includono alcun tipo di gestione di transazione (e vorrei
>implementarle).

Ciao,
più facilmente usa l'oggetto TransactionScope (da framework 2.0) in poi.
http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx
Inserisci tutto lì dentro ed è più facile da utilizzare rispetto ad altre soluzioni che ti hanno indicato.

Ricorda che se fai uso sempre di una sola connessione non c'è problema, ma se ne usi due come nell'esempio della pagina che ti ho linkato (leggi i commenti) la transazione diventa distribuita a quel punto hai bisogno di aver installato MSDTC sul server.
Ciao

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

Teech Profilo | Expert

Grazie mille David... Ci stò lavorando per inserire il tutto nel contesto della mia applicazione, ma la strada è sicuramente quella giusta.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5