2011-09-27 2 views
0

, 내가 생성/신경 끄시을 할 때 필요한도록 SqlConnection을 열고의 Application_EndRequestSqlConnection이 열린 상태로 유지되면 업데이트됩니까? 내 ASP.NET 프로젝트에서

에 닫습니다 그, 그냥 경우 연결 (연결 A를 말한다) 열려있는 동안, 무슨 일이 일어날 지 궁금, 데이터베이스가 다른 요청 (예 : 연결 B)에서 갱신됩니다.

그래서 그것처럼이

(예를 들어 처음에 x는 1)

A.Open()
B.Open()
B.UpdateX() -> SET X = 2
B.Close()
A.SelectX() ->이 값이 1 또는 2를 반환합니까?
A.Close()

답변

2

반환되는 데이터는 연결을 열 때가 아니라 쿼리를 실행할 때의 DB 상태에 따라 다릅니다.

코드에서 특정 트랜잭션 관리를 사용하지 말고 update 문이 하나의 별개의 행 또는 테이블 업데이트라고 가정 해 봅시다. 이 경우 연결 a에 X = 2가 표시됩니다. 이것은 두 연결 모두 두 연결 모두에 대해 커미트 된 기본 트랜잭션 레벨을 사용하기 때문입니다.

이제 예제에서는 단일 행의 단일 값 업데이트 인 경우 X 연결을 읽는 방법이 없습니다. 그러나 연결 B에서 트랜잭션을 사용하고 커밋하지 않고 연결을 열린 채로 두십시오. 연결 A에 대한 쿼리는 제한 시간이 만료 될 때까지 차단됩니다. 기본적으로 X는 B가 완료 될 때까지 액세스 할 수 없습니다.

또한 연결 1 트랜잭션의 1 천만 행을 업데이트하고 연결 A가 다른 스레드 및 트랜잭션에있는 경우. "읽기 미완료"트랜잭션 격리 수준을 사용하여 연결 A가 일부 오래된/부실/잘못된 데이터를 읽을 가능성이 있습니다.

희망이 도움이됩니다.

2

SQL 연결이 업데이트되지 않습니다. 이는 서버에 대한 파이프 일뿐입니다. 이것은 다른 곳으로 이동할 때 자동차가 업데이트되는 것과 같습니다.

세션의 트랜잭션 서버 측에서 연결이 atached로 설정됩니다 (참고 : 동일한 트랜잭션에 대해 여러 개의 연결을 가질 수 있음 - 대부분의 사람들은 모름) (암시 적 또는 명시적임) 그것은 격리 수준으로 구성됩니다. 때로는 음색이 필요할 때가 있습니다. 앉아서 디자인하십시오.

이제 연결을 유지하는 항목 중 하나가 페이지간에 제대로 재설정되지 않아 모든 종류의 바보 같은 문제가 발생할 수 있습니다. 꽤 많은 반감. 최근 오라클이 데이터 요청없이 2 시간이 지난 후에 서버가 클라이언트를 연결 해제 한 프로젝트에서 문제가 발생했습니다 ... - 다음 sql이 전송 될 때까지 연결이 "닫히지"않았거나 닫혔습니다. 당신이 원하지 않는 라인 아래의 재미있는 오류를 유발합니다 - connectin pooling을 사용하여 성능 오버 헤드를 상쇄합니다.

관련 문제