TransactionScope中的SQLtransactions

时间:2016-05-05 10:11:38

标签: sql-server vb.net tsql transactions sqltransaction

我在transactioncope中有一个sql事务,该事务正在进行提交或回滚。但是从我所读过的内容来看,提交/回滚没有任何意义,因为它由transactioncope控制。但是,如果我在没有提交或回滚的情况下将事务对象留在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

0 个答案:

没有答案