繁体   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