sabato 14 giugno 2008

Eseguire query in transazione

A chi non è mai capitato di dover effettuare operazioni (interrogazioni a db e inserimenti) legate tra di loro e di doversi servire di una transazioni per gestire la concorrenzialità sulla modifica dei dati da più connessioni?

Nel caso di DNN è abbastanza semplice prevedere la possibilità di utilizzare connessioni in transazione per effettuare operazioni tra di loro collegate ad esempio se ci fosse la necessità di leggere un dato da una tabella e scriverlo su un'altra evitando che possa essere modificato nel frattempo. in alternativa all'utilizzo di un store procedure possiamo implementare un metodo nel nostro data provider come quello che segue:

Public Overrides Function MyTransactionFunction() As string

Dim Exceptions As String = ""
Dim strQuery As String = ""
Dim s As StringBuilder = New StringBuilder("")
Dim Conn As New SqlConnection(ConnectionString)

Conn.Open()
Try
Dim Trans As SqlTransaction = Conn.BeginTransaction
Dim IgnoreErrors As Boolean
Dim ReturnedValue as integer
Try
'Prima query
s.Append("select myval ")
s.Append(" from " & DatabaseOwner & ObjectQualifier & "MyTab ")
ReturnedValue = SqlHelper.ExecuteScalar(ConnectionString, CommandType.Text, s.ToString)

'Seconda query
s = New StringBuilder("")
s.Append(" insert into ")
s.Append(DatabaseOwner & ObjectQualifier)
s.Append("My_Table ")
s.Append(" (col1,ReturnedValue) ")
s.Append(" values (")
s.Append(val1)
s.Append(",")
s.Append(ReturnedValue)
s.Append("')")
strQuery = s.ToString()
sqlDR = SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.Text, (strQuery))

Catch objException As SqlException
Exceptions += objException.ToString & vbCrLf & vbCrLf & strQuery & vbCrLf & vbCrLf
End Try

If Exceptions.Length = 0 Then
Trans.Commit()
Return "1"
Else
Trans.Rollback()
Exceptions += "Esecuzione SQL fallita. La transazione è stata annullata." & vbCrLf & vbCrLf & strQuery & vbCrLf & vbCrLf
Return Exceptions
End If
Catch objException As SqlException
Exceptions += objException.ToString & vbCrLf & vbCrLf & strQuery & vbCrLf & vbCrLf
objExeptionLog.AddLog(objException)
Finally
Conn.Close()
End Try

Return Exceptions
End Function
Come si vede dal codice viene istanziata una transazione e utilizzata sulla connessione al db per tutte le operazioni effettuate nel metodo. In questo modo è semplice gestire il rollback in caso di eventuali errori e il commit in caso di successo.

Nessun commento: