2012-03-26 4 views
-4

ASP.NET 프로젝트에서 문제를 디버깅하는 동안 동료가 메서드가 정적 SqlConnection을 인스턴스화하는 것으로 나타났습니다.정적 SqlDBConnection이 스레드가 다른 스레드의 결과 집합을 가져올 수 있습니까?

여러 스레드가 동일한 SqlConnection을 동시에 사용하는 경우 한 스레드의 SqlCommand가 실수로 다른 스레드의 SqlCommand에서 결과 집합을 가져올 수 있습니까? 예를 들어

, 같은 ASP.NET 페이지에 두 개의 동시 요청을 고려 :

요청 1 :

Dim Shared DbConnection As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("DbConnectionString")) 
Dim Query As SqlCommand = New SqlCommand("EXEC up_ShowReportInMenu 'abc',...", DbConnection) 
... 
Dim Reader As SqlDataReader = Query.ExecuteReader 

요청 2 :

Dim Shared DbConnection As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("DbConnectionString")) 
Dim Query As SqlCommand = New SqlCommand("EXEC up_ShowReportInMenu 'def',...", DbConnection) 
... 
Dim Reader As SqlDataReader = Query.ExecuteReader 

은 가능한 Reader에서인가요 요청 2가 요청 1의 SqlCommand에 의해 실행 된 쿼리에서 실수로 결과 집합에 액세스 할 수 있습니까?

P. 걱정하지 마십시오. 더 이상 정적이 아닌 것으로 바꿀 것입니다. 이것이 아마도 우리가 겪고있는 문제를 일으킬 수 있는지 궁금합니다. MSDN documentation for SqlConnection에 따르면

+0

예, 가능합니다. – antlersoft

+0

@antlersoft - 나를 가리킬 수있는 참조 사항이 있습니까? 첫 번째 Google 시도에서 확실한 것을 찾지 못했습니다. – mbeckish

답변

0

:

. "이러한 유형의 멤버 (Visual Basic의 경우 Shared) 모든 공용 static는 스레드로부터 안전은 모든 인스턴스 멤버는 스레드로부터 안전하지 않습니다."

그렇기 때문에 복수 스레드에서 동일한 SqlConnection 인스턴스에 액세스하는 것은 문제가 될 수 있습니다 (심지어 간접적으로는 SqlCommand).

+0

예, 여러 가지 예외가 발생할 수 있음을 알고 있습니다. 특히 궁금하네요 - 스레드 A에서 호출 된 SqlCommand.ExecuteReader가 스레드 B에서 실행 된 쿼리의 결과 집합을 가리키는 SqlDataReader를 반환 할 수 있습니까? – mbeckish

+0

@mbeckish 예외보다 나쁘다 - 이것은 정의되지 않은 동작이므로 특정 상황에서 "작동"하는 것처럼 보이더라도 일부 예외 상황이 올바르게 예외를 발생시키는 것처럼 보일지라도 피하는 것이 좋습니다. 설명하는 시나리오가 실제로 가능한지 여부는 논점입니다. –

+0

우리가 버그의 출처로 확실히 지적 할 수는 없기 때문에, 우리를위한 논점이 아닙니다. 나는 이것이 나쁜 습관이라는 것을 이미 알고 있었다.이 질문의 핵심은 누군가가이 특정한 행동이 가능한지 알았는지 여부를 확인하는 것이었다. – mbeckish

관련 문제