2010-03-30 1 views
5

이 일괄 적으로 호출 할 수 없습니다 세션 보안 컨텍스트 "는이 일괄 처리에서 동시에 호출 할 수 없으므로 호출 할 수 없습니다.SQL 예외 :</p> <p>"로 가장 : 동시 배치라고 불렀다 때문에"로 가장 세션 보안 컨텍스트는 "우리의 웹 응용 프로그램에서 SQL Server 2005로 연결을 열 때, 우리는 때때로이 오류가 표시

MARS 및 연결 풀링을 사용합니다.

예외 코드는 다음 장에서 유래 :

protected SqlConnection Open() 
{ 
    SqlConnection connection = new SqlConnection(); 
    connection.ConnectionString = m_ConnectionString; 
    if (connection != null) 
    { 
     try 
     { 
      connection.Open(); 
      if (m_ExecuteAsUserName != null) 
      { 
       string sql = Format("EXECUTE AS LOGIN = {0};", m_ExecuteAsUserName); 
       ExecuteCommand(connection, sql); 
      } 
     } 
     catch (Exception exception) 
     { 
      connection.Close(); 
      connection = null; 
     } 
    } 
    return connection; 
} 

는 I가 이전의 명령어가 아직 로그인 명령과 EXECUTE하는 것은 전송되기 전에 종료하지 않은 경우 에러가 발생되는 것을 알 수 MS Connect article 알았다. 연결이 방금 열렸 으면 어떻게 될 수 있습니까?

MARS와 이상하게 상호 작용하는 연결 풀링과 관련이 있습니까?

업데이트 : 단기간에 우리는 연결 풀을 제거 할 때마다 연결 풀을 제거하여 불량 연결을 없애고 다른 사용자에게 다시 넘겨주기 때문에 해결 방법을 구현했습니다. (이제는 5 ~ 10 회 하루에 동시 사용자 수가 적기 때문에 상당히 성가시다.) 그러나 다른 사람이 아이디어를 가지고 있다면 우리는 여전히 실제 솔루션을 찾고 있습니다.

답변

2

나는 오히려 다음 "Using Multiple Active Result Sets (MARS)는"거기에

  • Applications can have multiple default result sets open and can interleave reading from them.
  • Applications can execute other statements (for example, INSERT, UPDATE, DELETE, and stored procedure calls) while default result sets are open.

연결 풀링이 기본 형태가 열기/닫기 오버 헤드를 최소화 연결을 의미하지만 (MARS까지) 모든 연결은 한 가지를 가지고에서

을 풀링 MARS 말할 것이다 한 번에 계속. 풀링 (pooling)은 오랫동안 사용되어 왔으며, 그냥 그대로 작동합니다.

MARS (나는 그것을 사용하지 않았다)는 하나의 연결에 대해 겹쳐지는 "물건"을 소개합니다. 그래서 MARS가 원인이되는 이유는 연결 풀링은 2

의 큰 원인이 "Extending Database Impersonation by Using EXECUTE AS"

When impersonating a principal by using the EXECUTE AS LOGIN statement, or within a server-scoped module by using the EXECUTE AS clause, the scope of the impersonation is server-wide.

이 설명 할 수에서 오히려보다 MARS 아마 2 세션에서 동일한 교장은 모두 AS EXECUTE 실행 . 이 사용의 기사에서 뭔가, 또는 시도 할 수도 있습니다 :

IF ORIGINAL_LOGIN() = SUSER_SNAME() EXECUTE AS LOGIN = {0}; 

반사에이 대답을 읽은 후, 나는했습니다 확신하지 하나에 각 세션에 대해 (MARS)을 실행 컨텍스트를 변경하려고 연결은 좋은 생각입니다 ...

+1

답변 해 주셔서 감사합니다. 나는 그것이 MARS와 관련이 있어야한다는 데 동의하지만 확실하게 다중 결과 세트는 연결 단위로 존재합니까? 그리고 이전에 결과 세트를 얻지 못했습니다. 풀을 열었을지라도 새롭습니다. 두 번째 인용구에서 "가장 (impersonation)의 범위가 서버 전체"라고 말하면, 현재 연결에만 해당됩니다. – kasey

+0

@ kasey : 내 생각에 단일 연결에는 많은 세션이 있고 EXECUTE AS는 세션마다 있습니다. 연결이 풀에서 다시 사용되면 컨텍스트 스위치가 설정되어있는 것 같습니다. hhmm. 아마도 그냥 연결 풀링과 EXECUTE AS ... 여기에 흥미로운 질문이 있습니다. :-) – gbn

0

SQL 문 끝에서 되돌리기를 사용하려고 했습니까?

http://msdn.microsoft.com/en-us/library/ms178632.aspx

나는 언제나 반드시 현재의 상황이 정상으로 돌아 만들기 위해이 작업을 수행.

+0

좋은 생각은 있지만 예 - 우리는이 작업을 확실히하기 위해 블록을 잡았습니다. 그러나 잊어 버리면 다른 종류의 오류가 발생합니다. 그것을 (SQL Server에 의해 기록되는 'SEVERE ERROR') 수행하십시오. – kasey

1

연결 풀링을 비난하지 마십시오. MARS는 대혼란을 일으키는 것으로 꽤 유명합니다. 전적으로 비난은 아니지만 반나절입니다.기억해야 할 중요한 점은 MARS는 설계되었으며 "정상적인"DB 사용 (즉, 일반 CRUD는 관리 배치 없음)에서만 작동한다는 것입니다. DB 엔진에 광범위한 영향을 미치는 명령은 단 하나의 연결이고 단일 스레드 (예 : 테이블 또는 중첩 된 트랜잭션을 만들기 위해 설치 일괄 처리 실행) 인 경우에도 MARS를 이동할 수 있습니다.

MARS를 쉽게 비난 할 수 있지만, 99 %와 같은 일반 CRUD 시나리오 (ORM-s 및 LINQ와 같은 효율성이 낮은 것은 일생에 달려 있음)에서는 완벽하게 작동합니다. 사람들이 연결을 통해 SQL을 해킹하려면 MARS를 사용할 수 없다는 것을 사람들이 배우는 것이 중요하다는 것을 의미합니다. 예를 들어, 처음부터 전체 DB를 작성하는 설치 코드가 있었지만 배치에 매우 편리했습니다. 배포하는 웹 서비스와 연결을 공유하고있었습니다. - 죄송합니다 :-) 내 수업을 배우기 위해 며칠 동안 파고 들었습니다. . 그래서 저는 (항상 좋은) 관심사의 분리를 유지하고 문제는 사라졌습니다.