SQL Server에서 쿼리 시간 제한 강제


79

느린 데이터베이스에 대해 제대로 응답하지 않는 코드 블록에 문제가 발생했습니다 (쿼리 시간 초과시 침대를 허비 함). 패치를 만들었으며 회귀를 통해 실행하는 중입니다.

타임 아웃을받을 수 없습니다. SQL Mgmt Studio에서 트랜잭션을 열고 모든 행을 업데이트하여 잠그었지만 INSERT가 시간 초과되지는 않습니다 (필요한 것입니다).

T-SQL을 통해 테이블 ​​수준 잠금을 쉽게 얻을 수 있습니까? 아니면 마스터에서 바이올린을 켜야합니까? 아니면 잠그지 않고 쉽게 타임 아웃을 강제 할 수 있습니까? 모든 입력에 감사드립니다.

답변:


131

이것을 실행하고 삽입을 시도하십시오 ...

select * from yourTable with (holdlock,tablockx)

여기에서 5 분 동안 잠글 수 있습니다.

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

SQL Server를 호출 한 스레드를 차단하지 않고 C # /. NET에서이 작업을 수행 할 수있는 방법이 있습니까? 연결 시간이 초과 될 때 내 응용 프로그램의 동작을 테스트하려고합니다. 하지만 C #에서이 코드를 호출하면 다른 쿼리를 실행하는 방법을 모르고 의도적으로 시간 초과가 발생합니다.
Jake Smith

33

반환하기 전에 잠시 기다리도록 SQL 코드에 지시 할 수 있습니다.

WaitFor Delay '00:01:00'

답변의 단순성으로 투표했습니다. 나는 그것을 테스트하고 그것을 작동
미켈

나는 테이블을 채우고 복잡한 재귀 쿼리, 버프, 넌센스를 만들었습니다. 이것들은 트릭을 수행합니다.
DanielV

10

반대로 연결을 구성 할 수있는 경우 연결 문자열 시간 제한을 1 초로 줄이면 더 쉬워집니다. 테이블을 많은 데이터로 채우고 루프를 둘러싼 트랜잭션으로 해당 테이블의 청크를 업데이트하는 루프에서 3 개의 다른 프로세스가 회전하도록합니다. 앱에서 호출 한 실제 절차를 변경하지 마십시오 (대기 시간 주입). 이는 통합 테스트를 무효화합니다.

그러나 실제로 이것은 단위 테스트와 종속성 주입을 선호하는 사례 연구입니다. 일부는 통합 테스트가 어렵습니다. 단위 테스트 + 의존성 주입 .

  • Real : 크랩하는 코드-> 데이터베이스 시간 초과 (복제하기 어려움).
  • 리팩터링 : 코드-> 저장소 (데이터 액세스 만 수행)-> 데이터베이스
  • 단위 테스트 : 코드> 던질 모의 저장소 -> null
  • 이제 코드를 엉망으로 만들고 수정할 수있는 테스트에 실패했습니다.

이것은 "의존성"주입입니다. 개발자는 데이터베이스에 종속성을 삽입하여 종속성의 동작을 시뮬레이션하는 것으로 대체 할 수 있습니다. 모든 데이터베이스 테스트에 적합합니다. 어쨌든, 단위 테스트를 사용하면 수정이 필요한 작업을 수행한다는 것을 알지만 여전히 통합 테스트가 필요합니다. 이 경우 회귀에 더 초점을 맞출 수 있습니다. 즉, 테스트가 다른 것을 중단하지 않았고 기능이 여전히 작동 함을 의미합니다.

이미 패치를 만들었으므로 내 대답이 너무 늦었을 것 같습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.