我在 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?(即为什么begin trans
不包括在 vb.net 中?)为什么
ROLLBACK
在 SQL 中也不回滚客户端传输(但在客户端回滚确实回滚 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