共享功能关注

时间:2012-07-01 18:49:20

标签: .net vb.net

我正在使用以下Shared Function从DB中选择一个值。我担心的是,由于共享函数在所有对象之间共享,如果两个人几乎同时执行该函数,就会发生这种情况,数据将被覆盖?

我的意思是从DB返回的值将是最后一次(最近)执行的结果?

EG:

用户1执行该功能,应该“abcd” 用户2执行该功能,应该“1234”

用户2在用户1完成执行功能之前执行该功能。

但两位用户都获得“1234”

Public Shared Function SelectScalar(ByVal _sql As String, ByVal _parameterNames() As String, ByVal _parameterVals() As String) As String
            Dim _returnVal As String
            Dim _connection As SqlConnection = Global.Connection.GetDbConnection()
            Dim _command As New SqlCommand(_sql, _connection)
            Dim _value As String

            Try
                If _parameterNames IsNot Nothing Then
                    For i = 0 To _parameterNames.Length - 1
                        _command.Parameters.AddWithValue(_parameterNames(i), _parameterVals(i))
                    Next
                End If

                _value = CStr(_command.ExecuteScalar)
                _returnVal = _value
            Catch ex As Exception
                _returnVal = Nothing
            Finally
                If _connection.State = ConnectionState.Open Then
                    _connection.Close()
                    _connection.Dispose()
                    _command.Dispose()
                End If
            End Try

            Return _returnVal
        End Function

4 个答案:

答案 0 :(得分:1)

Shared Function s不会分享他们的“内部”状态,例如_returnVal。每次调用方法时都会创建所有局部变量的单独实例,并且每次调用都会跟踪它们自己的变量集,当在Shared Function内声明变量时,不会发生交叉讨论。

答案 1 :(得分:0)

在这种情况下(数据访问方法的并发执行),确定用户将看到的内容不是代码 - 它是数据库的配置方式 - isolation level查询的内容是什么

我建议在MSDN上阅读SET TRANSACTION ISOLATION LEVEL (Transact-SQL)以获取SQL Server中可用的选项。

答案 2 :(得分:0)

在这种情况下,这不会成为问题。 _returnVal是本地的,因此每个来电者都会获得自己的_returnVal。它们是否同时运行并不重要,因为它们各自都有自己的本地。

如果您将结果写入调用者共享的类字段,那么您可能会遇到问题。

答案 3 :(得分:0)

假设Global.Connection.GetDbConnection() 没有为两个并发呼叫提供相同的连接,正如所有其他答案所提到的那样,你会没事的。

如果多个调用获得相同的连接实例,则可以使用竞争条件,在另一个调用完成之前,在一次调用时关闭连接。