2

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

我的意思是从数据库返回的值将是最后(最近)执行的结果?

例如:

用户 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

4 回答 4

1

Shared Functions 不共享它们的“内部”状态,例如_returnVal. 每次调用方法时都会创建所有局部变量的单独实例,并且每次调用都会跟踪它们自己的变量集,当变量在Shared Function.

于 2012-07-01T18:55:47.820 回答
0

在这种情况下(数据访问方法的并发执行),决定用户将看到什么的不是代码——而是数据库的配置方式——查询的隔离级别是什么。

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

于 2012-07-01T18:55:28.303 回答
0

在这种情况下,这不会是一个问题。这_returnVal是一个本地的,所以每个调用者都会得到它自己的_returnVal。他们是否同时运行并不重要,因为他们每个人都有自己的本地。

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

于 2012-07-01T18:55:53.430 回答
0

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

如果多个调用获得相同的连接实例,您可能会出现一种竞争条件,即在另一个调用完成之前连接在一个调用上关闭。

于 2012-07-03T06:47:27.440 回答