2017-02-15 8 views
0

일정한 기간 동안 여러 SQL 쿼리를 실행하는 시나리오가 있습니다. 이 시나리오 전체에서 Select 문과 동시에 Update 문이 실행되어 동일한 테이블에 영향을 줄 가능성이 있습니다. 이 경우 내 SqlDataReader 개체는 Select 쿼리를 실행하고 행을 반환하지 않습니다. 그러나 Select 쿼리를 즉시 다시 시도하면 올바른 데이터가 수신됩니다. Select 문은 실제로 데이터를 반환하지 않아야합니다.Select 문에서 C# SqlDataReader가 때때로 Update 문이 동시에 실행될 때 행을 반환하지 않습니다.

결과를 얻기 위해 실패한 읽기 후에 쿼리를 다시 시도 할 수 있지만, 처음에는이 충돌을 피하고 싶습니다. 실제로는 실제로 행을 읽지 않고 콜리 전 오류가 발생하는 것을 구별하는 방법이 있습니다. SqlDataReader 개체를 검사 할 때 읽지 못했던 유일한 속성은 HasRows가 false로 설정된다는 것입니다.이 값은 내가 찾고있는 것에 충분하지 않습니다. 또한 읽으려고하면 false가 반환되고 읽기가 실패한 이유를 나타내는 오류가 발생하지 않습니다.

지금까지 선택 및 업데이트 쿼리에 잠금을 가하고 있지만 그와 같은 행운은 없었습니다. 이상적으로 Update 문은을 차단하지 않고 대기열을 잠글 것입니다. 트랜잭션이 완료 될 때까지 실행되는 쿼리를 선택하십시오. 나는 몇 가지 잠금 변화를 시도했다, 그러나 나는 시도 하나의 예는 다음을이었다 : 나는 예상대로

update <Tablename> with (TABLOCKX, HOLDLOCK) set ... 

이것은 충돌을 중지하지 않습니다, 그래서 붙어 곳이다.

빈 읽기가 없어야한다는 것을 알고있는 경우 가장 좋은 방법입니까, 아니면 SQL 잠금을 사용하는 것이 더 좋은 방법일까요?

+0

당신이 당신의 선택 문이 락을 대기해야 행이 출시 될 업데이트하는 경우. 업데이트에서 쿼리 힌트를 사용하고 이미이 동작을 변경하면 읽기를 사용하지 않는 한. –

+0

현재 유일한 업데이트 문은 내 업데이트 문에 있습니다. –

답변

0

Mutex을 살펴볼 수 있습니다. 이를 사용하여 동시에 하나의 인스턴스/쿼리 만 허용되도록 할 수 있습니다.

MSDN - Mutex