Stored를 호출하여 병렬 스레드의 두 SQL Server 테이블에서 CRUD를 수행하는 동안 위에서 언급 한 데드락 예외가 발생했습니다. 절차는 다음과 같습니다.SQL Azure - 트랜잭션 (프로세스 ID 160)이 다른 프로세스의 잠금 리소스에서 교착 상태에 있었고 교착 상태 피해자로 선택되었습니다.
우리는 코드 블록을 100-150 병렬 스레드로 돌리는 데스크톱 응용 프로그램을 가지고 있으며, 코드 블록은 SQL Bulk Copy을 사용하여 TableA에 삽입하고 3 개의 저장 프로 시저를 호출합니다. 저장 프로시 저는 TableA의 일부 선택에 따라 TableB에서 삽입, 업데이트 및 삭제를 수행합니다.
응용 프로그램이 스레드 실행을 시작하자마자 SQL Server는 스레드 수가 일정하게 실행되는 동안 특정 스레드 수에 대해 언급 된 데드락 예외를 던지기 시작합니다.
예외 메시지 : 트랜잭션 (프로세스 ID 160)이 다른 프로세스에서 잠금 리소스에 교착 상태가 발생하여 교착 상태 희생자로 선택되었습니다. 트랜잭션을 재실행하십시오.
이와 관련하여 도움이 될 것입니다.
감사합니다.
예, 병렬 실행 때문에 같은 개체 (두 테이블 중 하나)에 액세스하는 데 충돌이 있지만 여러 스레드가 동시에 같은 테이블에 액세스 할 수 있도록 데드락을 피하는 방법은 무엇입니까? 데이터베이스 수준 또는 저장 프로 시저 수준에 대한 특정 설정이 있습니까? –
같은 순서로 개체에 액세스하십시오. 트랜잭션을 짧고 한 번에 처리하십시오. 낮은 격리 수준을 사용하십시오. 행 버전 관리 기반 격리 수준을 사용하십시오. ... 바운드 연결을 사용하십시오. –