簡體   English   中英

asp.net和SQL Server +事務回滾

[英]asp.net & SQL Server + Transaction Rollback

我下面有一部分函數,​​該函數從第一個SProc檢索一個autoID並將其作為參數傳遞給另一個SProc。 在這里,我使用事務回滾,比方說,我有一個先例,即第一個SProc成功執行了所有操作,但在第二個SProc中遇到了問題,第一個SProc操作是否會與第二個SProc一起回滾? 一直以來,我只需要處理一項SProc交易,但這對我來說有點不同。 謝謝。

Public Shared Function VoucherRedemption(ByVal dbTrans As DbTransaction _
                                      , ByVal dbConnection As DbConnection _
                                      , ByVal receiptNo As String _
                                      , ByVal voucherNo As String _
                                      , ByVal customerCode As String) As Boolean
Dim dbCommand As DbCommand = Nothing

Try
            If DbConnection.State <> ConnectionState.Open Then
                DbConnection.Open()
            End If

            dbCommand = GetStoredProcedureCommand("Mem_Redeem")
            dbCommand.Connection = DbConnection
            dbCommand.Transaction = dbTrans

            AddInParameter(dbCommand, "@ReceiptNo", DbType.String, 50, DBNull.Value)
            If Not String.IsNullOrEmpty(receiptNo) Then
                dbCommand.Parameters("@ReceiptNo").Value = receiptNo
            End If

            AddOutParameter(dbCommand, "@OutAutoIDs", DbType.String, 4000, DBNull.Value)

            ExecuteNonQuery(dbCommand)

            Dim outAutoIDs As String = CType(dbCommand.Parameters("@OutAutoIDs").Value, String)

            dbCommand = GetStoredProcedureCommand("Mem_Redeem_Log_Add")
            dbCommand.Connection = DbConnection
            dbCommand.Transaction = dbTrans

            AddInParameter(dbCommand, "@VoucherNo", DbType.String, 50, DBNull.Value)
            dbCommand.Parameters("@VoucherNo").Value = voucherNo 

            AddInParameter(dbCommand, "@RedeemTransactAutoID", DbType.String, 4000, DBNull.Value)
            dbCommand.Parameters("@RedeemTransactAutoID").Value = outAutoIDs

     ExecuteNonQuery(dbCommand)

        Catch ex As Exception
            Throw New DALException(ex, dbCommand, customerCode, "VoucherRedemption")
        Finally
            If Not dbCommand Is Nothing Then
                dbCommand.Dispose()
            End If
            If Not dbTrans Is Nothing Then
                dbTrans.Dispose()
            End If
        End Try

看來您正在使用2個存儲過程。 使用TransactionScope而不是DbTransaction,因此,這里可能是您的代碼

Public Shared Function VoucherRedemption(ByVal dbTrans As DbTransaction _
                                      , ByVal dbConnection As DbConnection _
                                      , ByVal receiptNo As String _
                                      , ByVal voucherNo As String _
                                      , ByVal customerCode As String) As Boolean
Dim dbCommand As DbCommand = Nothing
Using scope As New TransactionScope()
Try 
            If DbConnection.State <> ConnectionState.Open Then
                DbConnection.Open()
            End If

            dbCommand = GetStoredProcedureCommand("Mem_Redeem")
            dbCommand.Connection = DbConnection

            AddInParameter(dbCommand, "@ReceiptNo", DbType.String, 50, DBNull.Value)
            If Not String.IsNullOrEmpty(receiptNo) Then
                dbCommand.Parameters("@ReceiptNo").Value = receiptNo
            End If

            AddOutParameter(dbCommand, "@OutAutoIDs", DbType.String, 4000, DBNull.Value)

            ExecuteNonQuery(dbCommand)

            Dim outAutoIDs As String = CType(dbCommand.Parameters("@OutAutoIDs").Value, String)

            dbCommand = GetStoredProcedureCommand("Mem_Redeem_Log_Add")
            dbCommand.Connection = DbConnection

            AddInParameter(dbCommand, "@VoucherNo", DbType.String, 50, DBNull.Value)
            dbCommand.Parameters("@VoucherNo").Value = voucherNo 

            AddInParameter(dbCommand, "@RedeemTransactAutoID", DbType.String, 4000, DBNull.Value)
            dbCommand.Parameters("@RedeemTransactAutoID").Value = outAutoIDs

     ExecuteNonQuery(dbCommand)

        Catch ex As Exception
            Throw New DALException(ex, dbCommand, customerCode, "VoucherRedemption")
        Finally
            If Not dbCommand Is Nothing Then
                dbCommand.Dispose()
            End If
        End Try
    scope.Complete()
End Using

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM