2012-07-01 3 views
2

Я использую следующее Shared Function, чтобы выбрать значение из БД. Меня беспокоит то, что, поскольку общие функции распределены между всеми объектами, может случиться так, что если два человека выполняют функцию почти одновременно, данные будет написано?share function

Я имею в виду, что значение, возвращаемое из БД, будет результатом последнего (самого последнего) выполнения?

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 
+1

Обратите внимание, что локальные переменные * не * совместно используются. – mellamokb

+0

Мои глаза болят от всех _ и типа под названием 'Global' –

ответ

1

Shared Function s не делит свое «внутреннее» состояние, например _returnVal. Отдельный экземпляр всех локальных переменных создается каждый раз, когда вызывается метод, и каждый вызов отслеживает свой собственный набор переменных, при этом переменные не объявляются внутри Shared Function.

+0

Большое спасибо за разъяснение. – user1150440

0

В этом случае (параллельное выполнение метода доступа к данным), то, что будет определять, что пользователи будут видеть не код - это как настраивается база данных - что такое isolation level запросов.

Я предлагаю прочитать SET TRANSACTION ISOLATION LEVEL (Transact-SQL) в MSDN для параметров, доступных на SQL Server.

+0

Большое спасибо за разъяснение. – user1150440

0

Это не будет проблемой в этом случае. _returnVal является локальным, поэтому каждый вызывающий абонент получит его _returnVal. Неважно, будут ли они работать в одно и то же время или нет, поскольку у каждого из них есть свои локальные.

Если вы пишете результат в поле класса, которое совместно используется вызывающими, вы можете иметь проблему, о которой вы говорите.

+0

Большое спасибо за разъяснение. – user1150440

0

Предполагая, что Global.Connection.GetDbConnection()не обеспечивает такое же соединение с двумя одновременными вызовами, как упомянуто всеми другими ответами, все будет в порядке.

Если несколько экземпляров имеют один и тот же экземпляр подключения, у вас может быть условие гонки, когда соединение закрывается по одному вызову до того, как он будет завершен.

+0

И BTW, это VB, вы можете использовать 'SelectScalar' вместо' _returnVal'. –

+0

На самом деле, я должен сказать 'Return CStr (_command.ExecuteScalar)' и сброс команд 'Catch' и final' Return' приведет к идентичным результатам для вашего текущего кода. –

Смежные вопросы