2011-11-15 3 views
3

우리의 애플리케이션에서는 C# 코드의 트랜잭션에서 15 개의 테이블에 레코드를 삽입합니다. 이를 위해 각 테이블에 대해 하나의 insert 문을 만들고 하나의 쿼리에 모두 추가하고 'ExecuteNonQuery'를 사용하여 테이블에 레코드를 삽입합니다. 삽입을 모든 테이블에서 수행하고 일치하지 않는 데이터는 원하지 않기 때문에 트랜잭션에서 사용합니다.테이블에 데이터를 삽입하는 동안 테이블 잠금을 피하는 방법

이 기능은 서비스로 작성되며 서비스 (동일한 서비스, 다른 설치)가이 작업 (테이블에 데이터 삽입)을 동시에 수행합니다. 이 서비스는 테이블에 전혀 다른 행을 삽입하며 어떤 방식으로도 종속되지 않습니다.

그러나 이러한 서비스를 실행하면 삽입 문에 교착 상태가 발생합니다.

코드는 다음과 같다 :

  1. 열기 DB 연결
  2. 트랜잭션을 커밋
  3. 테이블에 거래를
  4. 삽입 데이터를 시작합니다.

모든 서비스는 동일한 15 개의 테이블에있는 서로 다른 데이터 집합에서이 단계를 수행합니다.

SQL 프로파일 러 추적은 삽입 중에 이러한 테이블에 배타적 잠금이 있음을 나타냅니다.

테이블에 삽입 명령문을 실행하고 교착 상태로 끝내는 동안 테이블 수준 잠금이 필요한 이유를 제안하십시오. 그리고 그것을 막을 수있는 최선의 방법은 무엇입니까?

+0

다음을 참조하십시오. http://www.sql-server-performance.com/2006/deadlocks/ – hungryMind

+0

트랜잭션을 사용하지 않을 때 여전히 잠금을 유지합니까? –

+0

SQL Server 트랜잭션 또는 .net? .net 인 경우 코드를 표시하십시오 – gbn

답변

2

독점 잠금조차도 잠금 테이블에서만 교착 상태가 발생하지 않습니다. 테이블이 잠겨 있으면 새로운 인서트는 기존 인서트가 완료 될 때까지 기다립니다 (사용자가 no wait 힌트를 사용하지 않는다고 가정).

교착 상태는 SQL 문을 계속할 수 없도록 리소스를 잠그면 발생합니다. 삽입되지 않은 하위 선택 문이나 삽입 문에서 충분하지 않은 where 절을 찾습니다.

SQL을 게시하면 수행중인 작업을 볼 수 있습니다.

+0

할 수 있습니다. 순환 대기는 트랜잭션 A가 T1에서 X 잠금을 가져오고 트랜잭션 B가 T2에서 X 잠금을 얻으면 여전히 발생할 수 있습니다. B는 T1에서 X 잠금을 요청하고 T2에서 A 요청을 요청합니다. –

+0

마틴, 내가 말하려고했던 것입니다. 하나의 세션에서 A, B, C를 잠근 다음 다른 세션의 A, B, C가 교착 상태를 일으키지 않습니다. user1047169가 단일 트랜잭션을 사용하고 있고 15 개의 삽입이 항상 동일한 순서로 호출된다고 가정 할 때 많은 소스에서 삽입이 이루어지는 경우와 같이 순환 참조 문제가 없어야합니다. –

+0

둘 이상의 서비스가 관련되어있는 것과 동일한 순서로 호출된다고 가정 할 이유가 없습니다. OP가 실제로 교착 상태 그래프를 게시해야합니다. –

관련 문제