외래 키로 교착 상태가 발생하고 READ COMMITTED SNAPSHOT을 읽을 수 없습니까?


19

이것은 /programming/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically 의 후속 질문입니다.

큰 보고서를 동시에 실행할 때 ASP.NET 응용 프로그램에서 교착 상태 / 시간 초과 상황이 계속 발생 READ_COMMITTED_SNAPSHOT ON합니다.

그래서 두 가지 질문이 있습니다.

  1. 트랜잭션 격리 수준 스냅 샷 이 예상대로 작동하는지 확인하려면 어떻게 해야합니까?
  2. 웹 테이블의 보고서 테이블에 대한 외래 키가 교착 상태를 담당한다고 가정합니다. 이 흥미로운 기사를 찾았습니다 .

참고 트랜잭션이 읽기 커밋 된 스냅 숏 (행 버전 관리를 사용하여 커밋 된 읽기) 또는 스냅 숏 격리 수준을 사용하더라도 외래 키의 유효성을 검사 할 때 SQL Server는 공유 잠금을 얻습니다. 이러한 트랜잭션 격리 수준을 사용할 때 트랜잭션에서 교착 상태 그래프를 검사 할 때이 점에 유의하십시오. 공유 잠금이 표시되면 외래 키가 참조하는 객체에서 잠금이 수행되는지 확인하십시오.

FK가 교착 상태 / 시간 초과 상황에 실제로 책임이 있는지 어떻게 확인할 수 있습니까? 즉, 교착 상태를 방지하기 위해 외래 키를 삭제할 수 있습니까 (허용 가능한 노력은 무엇입니까)?

참고 : 교착 상태를 유발하는 테이블에서만 읽습니다.

이 주제에 대한 의견은 대단히 감사합니다.


여기 교착 상태 그래프가 편집 됩니다. 어쩌면 누군가 교착 상태의 원인을 이해하도록 도울 수 있습니다. 두 트랜잭션이 동일한 테이블을 작성하려고 할 때 웹 응용 프로그램으로 인한 보고서 만 실행되지 않은 것으로 보입니다 (하나의 업데이트와 하나의 삽입, 삽입은 저장 프로 시저와 같습니다). 왜 페이지 잠금을 요구하고 행 잠금 만 활성화합니까? Insert-SP는 이미 사용합니다 TRANSACTION ISOLATION LEVEL REPEATABLE READ.

두 개의 트리거 (하나의 업데이트와 하나의 삽입)가 교착 상태를 담당한다는 강한 의혹이 있습니다. 삽입 트리거는 다음과 같습니다.

CREATE TRIGGER [dbo].[CreateRMAFiDates] 
   ON  [dbo].[RMA] 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE RMA 
    SET [fiCreationDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.Creation_Date, 112) = tdefDate.Text),
        [fiPopDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.POP_Date, 112) = tdefDate.Text),
        [fiManufactureDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.Manufacture_Date, 112) = tdefDate.Text)
    FROM INSERTED;
END

따라서이 트리거는 RMA-Table을 업데이트하여 업데이트 트리거를 발생시키는 원인 (유사한 것)을 나타냅니다. 교착 상태 그래프가 내 가정을 확인합니까? 이 트리거는 SSAS-Cube (Molap) 전용이기 때문에 이러한 트리거를 삭제하고 하루에 한 번 실행되는 SP를 작성하면 충분하다고 생각합니다.

편집 : 그건 그렇고,이 트리거를 삭제 한 이후 더 이상 교착 상태가 없었습니다 :)

답변:


16

SQLCAT 팀이 FK 유효성 검사 가 읽기 커밋 된 격리를 사용하여 수행 되었다고 말하면 , 그들이 말하는 내용을 알아야합니다. 유효성 검사에 중점을 둡니다 . 실제 질문은 보고서가 FK 유효성 검사를 트리거하는 이유무엇 입니까? 쓰기 작업 에서 유효성 검사가 수행 되며 보고서를 읽습니다 . 보고서에서 쓰기가 발생하는 경우 스냅 샷 격리 수준이 아무 도움이되지 않습니다. 교착 상태의 원인이 다릅니다.

진행을하는 유일한 방법은 교착 상태 그래프를 캡처하는 것입니다.

다른 질문에 관해서는 스냅 샷 격리에서 작동하는지 어떻게 확인할 수 있습니까 sys.dm_tran_active_snapshot_database_transactions?


2

정확성을 위해 커밋 된 읽기 아래에서 외래 키 유효성 검사 가 수행 되어야합니다. 참조 스냅 샷 격리 : 무결성에 대한 위협? 자세한 내용은 Hugo Kornelis가 작성합니다.

교착 상태 그래프는 교착 상태를 RM2.dbo.RMA유발하는 두 개의 동시 실행을 보여줍니다 . RMA와 (과) 사이의 트리거 조건이 누락되었습니다 inserted.

이것은 감독이며 트리거가 실수로 모든 행을 업데이트 RMA하므로 동시 트리거 실행이 둘 이상인 경우 교착 상태가 발생할 가능성이 큽니다.

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