【发布时间】:2012-06-28 11:35:59
【问题描述】:
我在 vb.net 中开始交易。我在 SQL Server 2008 上执行了一个存储过程。该存储过程包含BEGIN TRANSACTION。它失败了,ROLLBACK 在CATCH 块中运行...
BEGIN CATCH
IF @@TRANCOUNT > 1 ROLLBACK
EXEC p_RethrowError
END CATCH
Rethrow 有效地执行了“raiserror”。
执行传递回 vb.net。执行“Catch sqlException”中的回滚。
问题:
为什么
@@TRANCOUNT是 1 而不是 2? (即 vb.net 中的begin trans怎么不包括在内?)为什么 SQL 中的
ROLLBACK也不会回滚客户端传输(但客户端中的回滚确实会回滚 SQL Server)?
最后,在 vb.net 中,如果您尝试在客户端内两次回滚事务,则会收到异常“事务已完成”。是否知道交易是否已完成或仍在等待中?谢谢。
----------- VB.Net 代码
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
【问题讨论】:
-
请添加一个代码示例,展示您如何在 vb.net 中开始交易
-
回滚不是事务范围类的方法,所以我不知道您是如何“在客户端内回滚两次”
-
对不起,我没有说清楚——在这个特定的例子中,我没有回滚客户端;但是,我尝试编写防御性代码,并且想知道是否有诸如“if transaction.pending then rollback”之类的语句。但仅就防御性编码而言,以防万一,无论出于何种原因,其他地方的另一个例程已经回滚(但在本例中没有)。
-
的意思是说,在这个特定的例子中,我没有回滚客户端“两次”
-
在您的代码块中,p_RethrowError 仅在@@TRANCOUNT > 1 时执行,但您问为什么@@TRANCOUNT = 1? p_RethrowError 没有执行吗?你有错误吗?
标签: sql-server vb.net sql-server-2008 transactionscope