때때로 데이터베이스 교착 상태가 발생하는 WCF 서비스가 있습니다. 내 서비스는 협의회에 신청서를 제출할 수있게하며 협의회가 협의회를 업데이트 할 수 있기 때문에 다시 협의 할 수 있습니다. 각 응용 프로그램에는 여러 개의 문서가 연관되어 있습니다. 느린 쿼리로 교착 상태를 피할 수있는 방법
그래서
이 같은 이벤트 집합 내 서비스에 난 이유는 2 부에서 문서가에서 SQL 서버에 제출하는 데 시간이 소요 믿습니다 제 3 부에서1) Application #1 is submitted
2) A document is uploaded for application #1
3) Application #1 is loaded
4) Part 2 above finishes
교착 상태가 발생하는 경우 WCF 서비스를 실행하고이 시간 동안 테이블을 잠급니다.
데이터베이스 응용 프로그램 # 1과 관련 문서를로드하면 문제가 발생합니다.
저는 엔터티 프레임 워크를 사용하고 있습니다. 이 문제를 어떻게 해결할 수 있습니까? 제가 정말로하고 싶은 것은 완전히 제출 된이 상황에서 문서를 적재하는 것입니다. 이것이 내가 무엇입니까 특정 오류입니다 그런데
, UPDATEMessage: Transaction (Process ID 93) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
: 내가 작업의 순서를 변경할 수있는 코멘트 몇 있었다. 파트 2와 파트 3이 WCF 서비스에 대한 서로 다른 호출에 있기 때문에 실제로는 그렇게 할 수 없습니다. 따라서 작업을 주문하는 것은 서비스 사용자가 결정합니다. '당신이 바꾸라고해라.'라고 말하지만, 그렇게 간단하지는 않습니다. 작업의 순서는 최종 사용자가 적절한 순간에 브라우저를 '새로 고'하는 일에 실제로 달려 있습니다.
업데이트 # 2 :이 문제를 재현하는 방법에 대한 조언이 필요합니다. 테스트 애플리케이션을 작성했고 위 파트 2는 파트 3에서 작업을 차단하지만, 결과는 작업 2가 완료되고 작업 3이 완료 될 때까지 작업 3이 막 차단된다는 것입니다.
그래서 파트 3은 보통 3 분이 아니라 1 분 50 초가 소요됩니다. 왜 그것이 나를 위해 차단되고 교착 상태가 발생하지 않는지에 대한 아이디어가 있습니까? 해당 서버에서 전체적으로 데이터베이스 트래픽의 양과 관련이 있습니까? 아니면 테스트 서버를 사용하고 있거나 데이터베이스 설정에 영향을 줄 수 있습니까?
1) 만 트랜잭션의 끝에서 saveChanges()
전화 함께 모든 쿼리를 실행 :
나는이 질문을 업데이트했다. 나는 그 작전의 순서를 정말로 통제 할 수 없다. 내 해결책은 파트 4 또는 파트 5와 관련이 있습니다. Part 5는 한 번에 여러 개의 스레드가 실행될 수 있기 때문에 좀처럼 들리지 않는다. – peter
여러 개의 스레드가 실행될 수 있지만 데드 록으로 이어지는 작업을 수행하는 코드 부분 만 동기화하면됩니다. 이렇게하면 전체 처리량이 줄어들지 만 다른 옵션은 격리 수준을 변경하여 잠금을 방지하는 것입니다. SNAPSHOT 격리 수준, SQL Server 2005의 새로운 기능으로 데드락 (dead-lock) 문제 해결 데이터를 변경할 때 잠금을 만드는 대신 다른 버전의 데이터를 저장하고 각 트랜잭션은 필요한 데이터의 버전을 읽습니다. –
처음 이었기 때문에 답을 쳤습니다. 나는 문제가 약간 완화 될 수 있다고 생각한다. 교착 상태의 원인이 된 쿼리는 필요하지 않은 데이터베이스 (blob)에서 필드를 가져 오는 것입니다. 즉, 쿼리에서 해당 필드를 제거하면 쿼리가 더 빨라지고 테이블이 잠길 때 발생할 가능성이 줄어 듭니다. 실제 문제를 파악하는 것은 차단을 야기 할 수 있다고 생각하고 있기 때문에 더 어려울 것입니다. 그러나 실제로 교착 상태를 일으키는 것을 해결하기 위해서는 좀 더 복잡해집니다. – peter