2013-05-29 4 views
0

임시 부하 (약 10 초)로 인해 반복되는 교착 상태가 발생하여 데이터베이스 형식 READ_COMMITED의 격리 수준을 READ_COMMITED_SNAPSHOT으로 변경하려고했습니다.트리거 내부에서 SQL Server READ_COMMITED_SNAPSHOT

가능한 한 많은 부분을 읽으려고했지만 확실한 것은 하나도 없습니다. 이것은 어떻게 데이터를 삽입 한 다음 삽입 된 행의 ID를 읽는 데 영향을 줍니까? 2 가능성이있어 거기

이들 2 행은 다른

1)

Insert into table (ID) value (3); 
Select Top 1 ID from table order by ID desc; 

2)

에 트리거 내부에 (저급 아이디 본있는 행이 존재한다고 가정)와 가정
Insert into table (ID) value (3); 
Select SCOPE_IDENTITY(); 

이론 상으로는 괜찮을 지 모르겠지만 확인을 좋아합니다. 감사합니다

+1

나는 교착 상태 그래프를보고 격리 수준을 변경하기 전에 느린 트랜잭션의 속도를 높이려고합니다. –

+0

나는 불행히도 이것은 (적어도 나의 능력은) 특정 테이블에 단일 행을 삽입 할 때 여러 테이블에 걸쳐 많은 데이터가 생성되기 때문에 가능하지 않다. 생성은 여러 개의 다른 테이블을 조인하여 원하는 데이터를 생성합니다. – LuigiEdlCarno

+0

교착 상태 그래프는 어떻게 받습니까? O_o – Serge

답변

2

Scope_Identity() 또는 OUTPUT 절을 사용하여 새 행에 할당 된 ID를 가져옵니다. 그들은 SELECT가 허락하는 경기 조건을 겪지 않습니다. 격리 수준에서 문제가 없어야합니다.

OUTPUT은 다양한 이유로 도구 가방에 넣는 것이 좋습니다. INSERT, DELETE, UPDATEMERGE 문에서 작동합니다. 단일 행에 국한되지 않습니다. 이는 ID 값뿐만 아니라 여러 열의 캡처를 허용합니다.

@@IDENTITY을 사용하지 마십시오. 어두운면에서 값을 가져옵니다. (예측할 수없는 값의 소스가 필요하지 않는 한) IDENT_CURRENT()도 거의 유용하지 않습니다.

+0

inserttrigger에 이미'inserted' 테이블이있는 동안 어떻게'output'합니까? 기존의'inserted' 테이블과 충돌하지 않습니까? – LuigiEdlCarno

+0

@LuigiEdlCarno - 'inserted'및 'deleted'테이블 ([Ref] (http://msdn.microsoft.com/en-us/library/ms191300.aspx))은 트리거를 유발 한 문의 동작을 반영합니다 발사.명령문의'OUTPUT' 절은 포함하고있는 명령문 _으로부터 당신이 선택한 컬럼을 명시 적으로 지시 할 수있게합니다. 갈등이 없습니다. – HABO