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 kommen begin 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?

Schreibe einen Kommentar