2012-07-01 2 views
2

DB에서 값을 선택하려면 다음 Shared Function을 사용하고 있습니다. 공유 기능이 모든 객체간에 공유되므로 두 사람이 동시에 거의 동시에 기능을 실행하면 데이터가 손상 될 수 있습니다 끝났습니까?공유 기능 관심

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

로컬 변수는 공유되지 않습니다. – mellamokb

+0

내 눈은 모든 종류의 'Global'이라는 유형에서 몹시 괴롭다. –

답변

1

Shared Function_returnVal과 같이 "내부"상태를 공유하지 않습니다. 메서드가 호출 될 때마다 모든 로컬 변수의 개별 인스턴스가 만들어지며 각 호출은 자신의 변수 집합을 추적하므로 변수가 Shared Function 안에 선언 될 때 상호 대화가 발생할 수 없습니다.

+0

설명해 주셔서 감사합니다. – user1150440

0

(데이터 액세스 방식의 동시 실행) 얻을, 사용자가 표시되는 내용을 결정하는 것은이 코드가 아닙니다 - 그것은 쿼리의 isolation level이 무엇인지 데이터베이스 구성 방법입니다.

SQL Server에서 사용할 수있는 옵션은 MSDN의 SET TRANSACTION ISOLATION LEVEL (Transact-SQL)을 읽기를 권장합니다.

+0

설명해 주셔서 감사합니다. – user1150440

0

이 경우 문제가되지 않습니다. _returnVal은 로컬이므로 각 발신자는 자신의 _returnVal을 받게됩니다. 그들 각자가 그들 자신의 지역을 가지고 있기 때문에 그들이 같은 시간에 또는 달려도 상관 없습니다.

호출자가 공유하는 클래스 필드에 결과를 쓰는 경우 언급 한 문제가있을 수 있습니다.

+0

설명해 주셔서 고맙습니다. – user1150440

0

Global.Connection.GetDbConnection()을 가정하면은 두 개의 동시 호출에 동일한 연결을 제공합니다. 다른 모든 응답에서 언급했듯이 괜찮습니다.

두 개 이상의 호출이 동일한 연결 인스턴스를 가져 오는 경우 다른 호출이 완료되기 전에 한 호출에서 연결이 닫히는 경쟁 조건을 가질 수 있습니다.

+0

그리고 BTW,이 VB에서, 당신은'_returnVal' 대신'SelectScalar'를 사용할 수 있습니다. –

+0

사실'Return CStr (_command.ExecuteScalar) '라고 말하고'Catch' 문과 마지막'Return' 문을 버리면 현재 코드와 동일한 결과가됩니다. –