Begin transaction in VB.net UND SQL Server 2008
Beginne ich eine Transaktion in vb.net. Ich ausführen einer gespeicherten Prozedur auf dem SQL Server 2008. Die gespeicherte Prozedur enthält BEGIN TRANSACTION
. Es schlägt fehl, und die ROLLBACK
im CATCH
block läuft...
BEGIN CATCH
IF @@TRANCOUNT > 1 ROLLBACK
EXEC p_RethrowError
END CATCH
Rethrow effektiv ist ein 'raiserror'.
Ausführung geht zurück auf vb.net. Rollback in "Catch sqlException" führt.
Fragen:
-
Warum ist
@@TRANCOUNT
1 statt 2? (d.h. wie kommenbegin trans
im vb.net ist nicht im Lieferumfang enthalten?) -
Warum
ROLLBACK
in SQL nicht rollback-client trans als gut (aber ein rollback in client keine rollback SQL-Server)?
Werden und schließlich in vb.net wenn Sie versuchen, ein rollback für die Transaktion zweimal innerhalb von client, Sie erhalten die Ausnahme "Transaktion abgeschlossen". Ist es trotzdem zu wissen, ob die Transaktion abgeschlossen wurde, oder noch anhängig? Danke.
----------- VB.Net Code
Public Sub sub1(ByVal intID As Integer, ByVal intValue as integer, ByVal intAuditUser As Int16)
Dim objConn As New SqlConnection(GetDBaseConnectionString())
objConn.Open()
'***** start the transaction ************************************************'
Dim objTrans As SqlTransaction = objConn.BeginTransaction()
Try
Call sub2(objTrans, intID, intValue, intAuditUser)
'***** commit the transaction ************************************************'
objTrans.Commit()
Catch es As SqlException
objTrans.Rollback()
Throw es
Catch ex As Exception
'***** rollback the transaction ************************************************'
objTrans.Rollback()
Throw ex
Finally
If objConn.State <> ConnectionState.Closed Then objConn.Close()
End Try
End Sub
Private Sub Sub2(ByVal objTrans As SqlTransaction, ByVal intID As Integer, ByVal intValue as integer, ByVal intAuditUser As Int16)
Dim objParams As New List(Of SqlParameter)
SqlHelper.AddInParameter(objParams, "ID", SqlDbType.Int, intID)
SqlHelper.AddInParameter(objParams, "Value", SqlDbType.Int, intValue)
SqlHelper.AddInParameter(objParams, "AuditUser", SqlDbType.SmallInt, intAuditUser)
'* save details'
SqlHelper.ExecuteNonQuery(objTrans, CommandType.StoredProcedure, "p_StoredProc_UpdateSomething", objParams.ToArray)
End Sub
- fügen Sie bitte ein Codebeispiel zeigt, wie Sie beginnen, die Transaktion in vb.net
- rollback ist nicht eine Methode auf mit der transactionscope Klasse, so weiß ich nicht, wie du bist "Rollback zweimal innerhalb client"
- Sorry, nicht mir klar - in diesem konkreten Beispiel im nicht Rollback-client; jedoch, ich versuche zu schreiben defensive code, und Frage mich, wenn theres so als Aussage wie "wenn die Transaktion.anhängig dann rollback". Aber nur in Bezug auf die defensive Codierung, nur für den Fall, aus welchem Grund auch immer, eine andere routine irgendwo anderes schon rollbacked (aber nicht in diesem Fall).
- code Hinzugefügt.
- soll sagen, in diesem speziellen Beispiel im nicht Rollback-client "zweimal"
- in Ihrem code-block, p_RethrowError nur ausgeführt wird, wenn @@TRANCOUNT > 1, aber Sie Fragen sich, warum die @@TRANCOUNT = 1? Ist p_RethrowError nicht ausgeführt? Sie bekommen eine Fehlermeldung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist 2. Das ist, wie es ist dokumentiert, und wenn es nicht 2, die server-Seite
ROLLBACK
würde nicht ausführen.Gibt es keine separate client-seitigen Transaktionen. Es ist alles der gleiche server-side-Transaktion und
ROLLBACK
immer rollt sich zurück die Transaktion unabhängig von der aktuellen @@TRANCOUNT-Wert und unabhängig davon, wo der rollback eingeleitet wurde.Die Umsetzung der
SqlTransaction.Rollback
ist ziemlich kompliziert, hat verschiedene Pfade für die zombie-Transaktionen, pre-SQL-Server 2005 und post-SQL Server 2005, und zum Beispiel die original pre-2005-Pfad führt eine einfacheRollback
Aufruf so:...und die
SqlTransaction
client side object zusätzlich in einen zombie-Modus, das ist der Grund, warum Sie den Fehler gesehen haben, nachdem Sie danach versucht zu führenROLLBACK
auf der gleichenSqlTransaction
Objekt wieder.Den code-Pfad, auf dem SQL Server 2008 ist ähnlich, außer dass es ist nicht nach Menschen lesbare SQL mehr.
Dies erklärt, warum Sie nur die Fehler mit dem zweiten und nachfolgende Aufrufe von
SqlTransaction.Rollback
, auch wenn das rollback war schon unwiderruflich eingeleitet, die innerhalb der gespeicherten Prozedur.Ja. Sehen hier für einen Weg:
Wenn kann somit testen, wie diese:
SqlTransaction
Objekt kann nicht gehen, um zombie-Modus). Nach dem Aufruf der client-Seite, rollback, geht es sofort in zombie-Modus, und so können Sie nicht an der client-Seite, rollback zweimal.Hey Doktor Chris Chris,
Zugegebenermaßen nicht viel zu tun haben mit Ihrer ersten Frage. Aber nach der Lektüre Ihr Kommentar, wie Sie eine Transaktion beginnen, in vb.net. Dies könnte helfen:
Hoffnung, die Sie bekommt begann, in eine bessere Richtung!
-sf