Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TransactionScope内的SQLtransactions_Sql Server_Vb.net_Tsql_Transactions_Sqltransaction - Fatal编程技术网

Sql server TransactionScope内的SQLtransactions

Sql server TransactionScope内的SQLtransactions,sql-server,vb.net,tsql,transactions,sqltransaction,Sql Server,Vb.net,Tsql,Transactions,Sqltransaction,我在transactionscope中有一个sql事务,该事务正在执行提交或回滚。但是从我读到的内容来看,提交/回滚没有任何意义,因为它是由transactionscope控制的。但是,如果我将事务对象保留在dosomething方法中,而没有提交或回滚,那么我的webservice方法(正在保存到数据库中)将无法工作,因为单个事务对象已获得锁。有人能解释一下这是怎么可能的吗?或者这是通常的行为,如果是,为什么 public sub test() Using ts As New Trans

我在transactionscope中有一个sql事务,该事务正在执行提交或回滚。但是从我读到的内容来看,提交/回滚没有任何意义,因为它是由transactionscope控制的。但是,如果我将事务对象保留在dosomething方法中,而没有提交或回滚,那么我的webservice方法(正在保存到数据库中)将无法工作,因为单个事务对象已获得锁。有人能解释一下这是怎么可能的吗?或者这是通常的行为,如果是,为什么

public sub test()
   Using ts As New TransactionScope()
    Save_CustomerDetails()         
    Save_AddressDetails()
    'cannot show the code for security reasons
    CallToWebServiceFunctionWhichSavesTheDataInDatabase()
    ts.Complete()
   End Using
end sub

Private Sub Save_CustomerDetails()
    Dim ExistingData As DataSet
    Dim DB_CustomerDetails As New CustomerDetails(objDBconn.Connection, objDBconn.Transaction)

    Try
        ExistingData = DB_CustomerDetails.CustomerDetails_Set()

        If DB_CustomerDetails.ReturnCode<> 0 Then
            Throw New ReturnException(DB_CustomerDetails.ReturnCode)
        End If


    Catch lex As ReturnException
        JavaOnload = lex.AlertMessage
        Throw
    Finally
        DB_CustomerDetails = Nothing
        If Not(objDBCommon Is Nothing) Then
                       objDBCommon.CleanUp()
                    End If

    End Try
End Sub

Public Sub Save_AddressDetails()

    Dim DB_AddressDetails As New AddressDetails(objDBCommon.Connection, objDBCommon.Transaction)

    Try

        ExistingData = DB_AddressDetails.AddressDetails_Set()

        If DB_AddressDetails.ReturnCode<> 0 Then
            Throw New ReturnException(DB_AddressDetails.ReturnCode)
        End If


    Catch lex As ReturnException
        JavaOnload = lex.AlertMessage
        Throw
    Catch lex As System.Exception
        Throw
    Finally
        DB_AddressDetails = Nothing
    End Try
End Sub

 Function CustomerDetails_Set(Optional ByVal inFunction As String = "")

    Dim Params() As SqlClient.SqlParameter

    Try

        Parameters.Clear()
        Params = MyBase.GetParameters(Me.Connection, "sprCustomerDetails_Modify", True)

        AddParam(Parameters, Params(0), ParameterDirection.ReturnValue)
        AddParam(Parameters, Params(1), ParameterDirection.Input, inFunction)
        AddParam(Parameters, Params(2), ParameterDirection.Input, m_Customer_ID)

        MyBase.CommandType = CommandType.StoredProcedure
        MyBase.CommandText = "sprCustomerDetails_Modify"
        MyBase.Transaction = Me.Transaction
        MyBase.Connection = Me.Connection
        MyBase.Load(m_oDS)

        ReturnCode = Parameters.Item(0).Value
        Return m_oDS

    Catch ex As SqlClient.SqlException
        If ex.Number = eReturnCodes.SaveSinceLastUpdate Then
            ReturnCode = ex.Number
        Else
            Throw
        End If
    Finally
    End Try
End Function

Function AddressDetails_Set(Optional ByVal inFunction As String = "") As DataSet
            Dim Params() As SqlClient.SqlParameter

            Try

                    Parameters.Clear()
                    Params = MyBase.GetParameters(Me.Connection, "sprAddressDetails_Modify", True)

                    AddParam(Parameters, Params(0), ParameterDirection.ReturnValue)
                    AddParam(Parameters, Params(1), ParameterDirection.Input, inFunction)
                    AddParam(Parameters, Params(2), ParameterDirection.Input, m_Customer_ID)

                    MyBase.CommandType = CommandType.StoredProcedure
                    MyBase.CommandText = "sprAddressDetails_Modify"
                    MyBase.Transaction = Me.Transaction
                    MyBase.Connection = Me.Connection
                    MyBase.Load(m_oDS)

                    ReturnCode = Parameters.Item(0).Value
                    Return m_oDS
            Catch ex As SqlClient.SqlException
                    If ex.Number = eReturnCodes.SaveSinceLastUpdate Then
                            ReturnCode = ex.Number
                    Else
                            Throw
                    End If
            Catch ex As System.Exception
                    Throw
            Finally
            End Try
    End Function

 Protected Overridable Function GetParameters(ByRef inConnection As SqlClient.SqlConnection _
                                    , ByVal inStoredProcedureName As String _
                                    , ByVal inIncludeReturnValue As Boolean) As SqlClient.SqlParameter()

    Return SqlHelperParameterCache.GetSpParameterSet(inConnection, inStoredProcedureName, inIncludeReturnValue)
End Function

 Public Sub CleanUp()

    Try
        If Not Me.Transaction Is Nothing Then
            If m_ReturnCode< 0 Then
                Try
                    Me.Transaction.Rollback()
                Catch ex As Exception
                End Try
            Else
                Try
                    Me.Transaction.Commit()
                Catch ex As Exception
                End Try
            End If
        End If

        If Me.Connection.State = ConnectionState.Open Then
            Me.Connection.Close()
        End If
    Catch ex As Exception
    Finally
        If Not Me.Transaction Is Nothing Then
            Me.Transaction.Dispose()
            Me.Transaction = Nothing
        End If
        If Not Me.Connection Is Nothing Then
            Me.Connection.Dispose()
            Me.Connection = Nothing
        End If
    End Try

End Sub
公共子测试()
将ts用作新的TransactionScope()
保存客户详细信息()
保存地址详细信息()
'由于安全原因,无法显示代码
CallToWebService函数,用于将数据保存到数据库()中
ts.完成()
终端使用
端接头
私有子存储_CustomerDetails()
将现有数据设置为数据集
Dim DB_CustomerDetails作为新CustomerDetails(objDBconn.Connection,objDBconn.Transaction)
尝试
ExistingData=DB_CustomerDetails.CustomerDetails_Set()
如果DB_CustomerDetails.ReturnCode为0,则
抛出新的ReturnException(DB_CustomerDetails.ReturnCode)
如果结束
将lex捕获为ReturnException
JavaOnload=lex.AlertMessage
扔
最后
DB_CustomerDetails=无
如果不是(objDBCommon什么都不是),那么
objDBCommon.CleanUp()
如果结束
结束尝试
端接头
公共子存储地址详细信息()
Dim DB_AddressDetails作为新的AddressDetails(objDBCommon.Connection,objDBCommon.Transaction)
尝试
ExistingData=DB\u AddressDetails.AddressDetails\u Set()
如果DB_AddressDetails.ReturnCode 0,则
抛出新的ReturnException(DB_AddressDetails.ReturnCode)
如果结束
将lex捕获为ReturnException
JavaOnload=lex.AlertMessage
扔
将lex捕获为系统异常
扔
最后
DB_AddressDetails=无
结束尝试
端接头
函数CustomerDetails_Set(可选ByVal inFunction As String=“”)
Dim Params()作为SqlClient.SqlParameter
尝试
参数。清除()
Params=MyBase.GetParameters(Me.Connection,“sprCustomerDetails\u Modify”,True)
AddParam(参数,参数(0),参数方向。返回值)
AddParam(参数,参数(1),参数方向。输入,inFunction)
AddParam(参数,参数(2),参数方向。输入,m_客户ID)
MyBase.CommandType=CommandType.StoredProcess
MyBase.CommandText=“sprCustomerDetails\u Modify”
MyBase.Transaction=Me.Transaction
MyBase.Connection=Me.Connection
MyBase.Load(m_oDS)
ReturnCode=参数。项(0)。值
返回m_oDS
捕获ex为SqlClient.SqlException
如果ex.Number=eReturnCodes.SaveSinceLastUpdate,则
返回代码=出厂编号
其他的
扔
如果结束
最后
结束尝试
端函数
函数AddressDetails_集(可选ByVal inFunction As String=“”)作为数据集
Dim Params()作为SqlClient.SqlParameter
尝试
参数。清除()
Params=MyBase.GetParameters(Me.Connection,“sprAddressDetails_Modify”,True)
AddParam(参数,参数(0),参数方向。返回值)
AddParam(参数,参数(1),参数方向。输入,inFunction)
AddParam(参数,参数(2),参数方向。输入,m_客户ID)
MyBase.CommandType=CommandType.StoredProcess
MyBase.CommandText=“sprAddressDetails\u Modify”
MyBase.Transaction=Me.Transaction
MyBase.Connection=Me.Connection
MyBase.Load(m_oDS)
ReturnCode=参数。项(0)。值
返回m_oDS
捕获ex为SqlClient.SqlException
如果ex.Number=eReturnCodes.SaveSinceLastUpdate,则
返回代码=出厂编号
其他的
扔
如果结束
捕获ex作为系统异常
扔
最后
结束尝试
端函数
受保护的可重写函数GetParameters(ByRef inConnection作为SqlClient.SqlConnection_
,ByVal inStoredProcedureName作为字符串_
,ByVal inIncludeReturnValue作为布尔值)作为SqlClient.SqlParameter()
返回SqlHelperParameterCache.GetSpParameterSet(在连接中,inStoredProcedureName,inIncludeReturnValue)
端函数
公共子系统清理()
尝试
如果不是我,那么交易什么都不是
如果m_ReturnCode<0,则
尝试
Me.Transaction.Rollback()
特例
结束尝试
其他的
尝试
Me.Transaction.Commit()
特例
结束尝试
如果结束
如果结束
如果Me.Connection.State=ConnectionState.Open,则
Me.Connection.Close()
如果结束
特例
最后
如果不是我,那么交易什么都不是
Me.Transaction.Dispose()
Me.Transaction=Nothing
如果结束
如果不是我,那么连接就什么都不是了
Me.Connection.Dispose()
连接=什么都没有
如果结束
结束尝试
端接头

您能告诉我们您的实际代码吗?没有定义
ts
,并且在任何情况下都超出了使用范围。当我们看不到您实际在做什么时,很难给您一个答案。如果在
TransactionScope
中,
Transaction.Commit
在事务作用域完成之前不会实际提交。这并不意味着你不用再打电话了@JeroenMostert:如果交易失败