2010-12-15 3 views
1

그들은 라디오로 오랫동안 청취 한 사람에게 처음으로 전화를 건 사람처럼 ....DataReader 및 SQLCommand

다음은 나의 문제입니다. VS 2005 SQL Server 2005 데이터베이스 Windows Forms 앱. 기음#. 큰 테이블 - 780K 레코드. 나는 그것을 소스 테이블이라고 부를 것이다. 소스 테이블을 반복해야하고 각 레코드에 대해 다른 테이블로 무언가를 수행 한 다음 완료된 소스 테이블에 다시 기록하십시오. 아직까지 두 번째 테이블을 업데이트하지 못했습니다 ...

연결 개체 A를 사용하는 datareader를 사용하여 원본 테이블의 모든 레코드를 반복합니다. 각 레코드에 대해 원본 테이블을 업데이트하는 업데이트 문을 작성합니다 이 레코드가 처리되었음을 나타내려면 - 연결 개체 B에 대해 SQL 명령을 사용하여이 uodate를 수행합니다. 그래서 다른 연결 객체는 dataReader가 독점적 인 것을 원한다는 것을 알고 있기 때문입니다.

여기에 문제가 있습니다. X 레코드 (X가 약 60 인 것으로 보이는)를 처리 한 후 업데이트 시간 초과.

이 글을 쓰는 동안 재미있는 일이 아닌 것 같습니다. 내 머리가 트랜잭션 분리 및/또는 잠금과 관련이 있다고 말합니다. 나는 데이터 레코드를 사용하여 소스 레코드를 읽었지만 그 레코드를 변경하고있다 ... 나는 이것이 다른 트랜잭션 격리에 문제를 일으키는 것을 볼 수있다. 그래서 나는 그것에 대해 살펴볼 것이다. ...

누구나이 방법을 알고 해결하는 방법을 알고있다. 그것? 명령 개체의 명령 시간 초과 때에 프로퍼티를 설정해야합니다 같은

건배

피트

답변

1

자세한 내용이 없으면 솔루션 가능성이 매우 많습니다. iivel은 데이터베이스 자체 내에서 모든 작업을 수행 할 수 있습니다. 수행해야하는 작업 유형에 해당하는 작업을 수행 할 수 있습니다. 커서 대신 집합 기반 연산을 사용하는 것이 가장 좋을 것이라고 덧붙이겠다.

데이터베이스 외부에서이 작업을 수행해야하는 경우 안전하게 수행 할 수있는 경우 원본 쿼리가 전혀 잠금없이 실행될 수 있습니다. 격리 수준을 설정하거나 쿼리의 테이블 이름/별칭 뒤에 with (nolock)을 단순히 추가하여이 작업을 수행 할 수 있습니다.

다른 여러 옵션이 있습니다. 예를 들어, 원본 테이블에서 메모리로 한 번에 1000 개의 레코드를 가져 와서 연결을 끊은 다음 필요한 작업과 업데이트를 수행하는 등 일괄 적으로 작업 할 수 있습니다. 1000 개의 레코드가 모두 처리되면 큐의 모든 레코드가 처리 될 때까지 1000 개의 다른 레코드 집합에 대한 작업이 계속됩니다.

+0

데이터베이스 내에서 수행 할 수 없습니다 - 논리 RE의 톤을 C#으로 작성하려는 두 번째 테이블을 업데이트하고 이미 일부 코드가 있습니다. 여기에 오기 전에 놀식을 시도했는데 그 문제가 해결되었습니다.왜 다음 질문입니까? nolock으로 독자가 사용하는 쿼리를 실행해도 작성자가 차단되지 않습니다. 따라서 nolock을 사용하지 않을 때 소스 레코드가 데이터 보관 기간 동안 잠겨 있다는 것을 알려주는 것은 무엇입니까? –

+0

예, 레코드가 공유 잠금으로 잠겨있어 (즉, 읽기 지속 시간 동안 일치하도록) 잠긴 레코드에 대해 업데이트를 수행 할 수 없습니다. 다른 연결은 레코드를 볼 수 있지만 수정할 수는 없습니다. –

0

커서에서 선택/업데이트 할 수없고 앱에 최종 결과 집계를 보낼 수없는 이유가 있습니까? 프로세스가 DB에 속해 있다면 DB에 저장하는 것이 가장 좋습니다.

John이 언급 한대로 명령 타임 아웃을 번갈아 업데이트하는 것이 유일한 다른 방법입니다.

+0

게시물에 대한 감사 - 내 다른 답변을 참조하십시오. 타임 아웃 문제가 아닙니다. 소스에서 nolock을 사용하여 수정 한 일부 잠금/트랜잭션 문제입니다. 건배 피트 –