我正在使用以下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
答案 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()
没有为两个并发呼叫提供相同的连接,正如所有其他答案所提到的那样,你会没事的。
如果多个调用获得相同的连接实例,则可以使用竞争条件,在另一个调用完成之前,在一次调用时关闭连接。