[sql-server] SQL Server에서 쿼리 시간 제한 강제

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

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

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



답변

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

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 코드에 지시 할 수 있습니다.

WaitFor Delay '00:01:00'


답변

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

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

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

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

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


답변

이 블로그 게시물을 확인하십시오. 기본적으로 SQL Server에는 쿼리 시간 제한이 없습니다. 클라이언트는 SQL 시간 제한을 적용 할 수 있지만 엔진 자체는 그렇지 않습니다.

http://blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx


답변