2017-01-06 3 views
1

독자 내부에서 루핑 중이며 독자가 읽고있는 다른 테이블을 업데이트 중입니다. 모든 1000 개 루프 나는)합니다 (transation를 저지하고 싶지만 오류주고 : 나는이 개 다른 답변을 본 적이 그 중 하나가 독자 가까운 말했지만 우리는 분명 우리가 '같은 것을 할 수없는datareader 루프 내에서 트랜잭션을 커밋하십시오.

The transaction operation cannot be performed because there are pending requests working on this transaction.

을 판독기에서 해당 데이터를 사용하여 갱신 명령문을 실행하고 다른 테이블을 갱신하십시오.

그래서 연결에 트랜잭션을 만들면 일부 SQL 명령을 반복하는 datareader가 있습니다. datareader 루프 내에서 update 명령을 실행하고 트랜잭션을 commit()하는 방법은 무엇입니까? datareader 루프?

1) 두 번째 연결을 열고 트랜잭션 업데이트를 위해 그것을 사용

+0

당신은 당신의 코드를 게시 할 수 있습니까? 트랜잭션에 다른 트랜잭션 격리 수준 설정이 필요할 수있는 동시성 문제가 발생할 수 있습니다. –

+0

이미 앱에 있던 기존 데이터 웨어레이터 루프에이 코드를 삽입하는 것만 큼 짜증나고 심층적 인 코드입니다. 그것을 어기는 것은 어렵습니다. 이와 같은 일을하는 것이 일반적이거나, 가능하지 않은 경우에 나는 단지 궁금했습니다. – user441521

+0

트랜잭션 쓰기 작업에 대해 두 번째 독립적 인 연결을 사용할 수 있습니다 (트랜잭션을 1000 회마다 커밋하면 대량 업데이트가 아닌 이유는 무엇입니까?) 또는 datareader 생성자 옵션으로 재생하면 소위 Firehose 모드이며, 정확히 "기억할 수없는"업데이트 가능한 모드가있었습니다. 트랜잭션 내에서 다르게 동작하는 것으로, 찾는 가치가있을 수 있습니다. – dlatikay

답변

1

는이 작업을 달성하기 위해 두 가지 옵션이 있습니다.

2) SQL 서버의 "다중 활성 결과 집합"옵션을 사용하여

If two batches are submitted under a MARS connection, one of them containing a SELECT statement, the other containing a DML statement, the DML can begin execution within execution of the SELECT statement.

출처 : https://msdn.microsoft.com/en-us/library/h32h3abf(v=vs.110).aspx

+0

실행 중에 실행할 수 있습니다. 두 번째 연결을 추측하여 볼 수없는 임시 테이블 (SQL 서버의 #)에서 업데이트가 발생합니다 그? 어쩌면 글로벌 (##) 임시 테이블 대신에 그것을 볼 수 있을까요? – user441521

+0

사실, 한 세션은 다른 세션의 임시 테이블을 볼 수 없습니다. 그 거래를 왜 다시해야 하죠? 업데이트 된 테이블이 연결에 비공개이고 다중 스레딩이 아닌 경우 트랜잭션이 어떤 값을 추가하는지 알 수 없습니다. – dlatikay

+1

속도. 이를 사용하지 않으면 우리가 실행하는 각 업데이트 문에 대해 암시 적 트랜잭션을 수행하게되며, 이는 독자가 모든 레코드를 루핑 할 때 수십만 개가 수행됩니다. 기존 프로세스는 효율적이지 않지만 지금 당장 해결해야 할 과제는 아닙니다. 그걸로 돼지를 피하려고합니다. – user441521