![](/img/trans.png)
[英]How to rollback multiple transaction in (C#) ASP.NET and 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.