2

最初のトランザクションをテストしようとしていますが、それが成功した場合は 2 番目のトランザクションを試し、2 番目のトランザクションも成功した場合は両方をコミットし、2 番目のトランザクションが失敗した場合は最初のトランザクションをロールバックする必要があります。

したがって、状態の1つである辞書を返す次の関数があります。

0 (トランザクションは失敗したが、ロールバックできたことを意味する) -> sql トランザクション

1 (トランザクションが成功したことを意味します) -> sql トランザクション

-1 (トランザクションが失敗し、ロールバックできなかったことを意味します) -> sql トランザクション

Public Function execDBTrans_valMod(transactionName As String, ByVal emailSubject As String, ByVal emailBody As String, ByVal queryString As String, Optional ByVal connectionString As String = "SQLConnectionHere") As Dictionary(Of Integer, SqlTransaction)
        Dim trans_dict As New Dictionary(Of Integer, SqlTransaction)

        Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings(connectionString).ToString) 'LATEST EXEC
            connection.Open()

            Dim command As New SqlCommand(queryString, connection)
            Dim transaction As SqlTransaction = connection.BeginTransaction(transactionName)
            command.Transaction = transaction

            Try
                command.CommandTimeout = 3600 'Used for large updates
                command.ExecuteNonQuery()
                'transaction.Commit() DO NOT COMMIT so that we can commit only after we verify that pbSite can be inserted

                trans_dict.Add(1, transaction)
                Return trans_dict
            Catch dbTrans_ex As Exception
                Try
                    transaction.Rollback()

                    trans_dict.Add(0, transaction)
                    Return trans_dict
                Catch dbTrans2_ex As Exception

                    trans_dict.Add(-1, transaction)
                    Return trans_dict
                    ' This catch block will handle any errors that may have occurred on the server that would cause the rollback to fail, such as a closed connection.
                End Try
            End Try

        End Using
    End Function

次に、関数に次のコードがあります。

Dim transPB_dict = execDBTrans_valMod("transPB", failSubject, failBody, buildInsert)
If transPB_dict.ContainsKey(1) Then 'SUCCESS

    Dim transPBsite_dict = execDBTrans_valMod("transPBsite", failSubject, failBody, buildInsert_PBsite)

    If transPBsite_dict.ContainsKey(1) Then
        transPB_dict.Item(1).Commit()
        transPBsite_dict.Item(1).Commit()
        Return True
    Else 'Failed to create the tables for this user so rollback all the tables that were created in the previous transaction (all the old tables in panelbase)
        transPB_dict.Item(1).Rollback() 'THIS THROWS THE ERROR This SqlTransaction has completed; it is no longer usable

        Return False
    End If

Else
        Return False
End if

最初のトランザクションをまだコミットしていません。ロールバックしようとすると、sqlTransaction が完了したと表示されるのはなぜですか?

助けてくれてありがとう!

4

2 に答える 2