3 계층 앱이 있고 데이터가 클라이언트 측에 캐시되어 있으므로이 캐시를 동기화하기 위해 서버에서 데이터가 변경된시기를 알아야합니다.테이블 업데이트시 교착 상태 방지하기
그래서 테이블에 "lastmodification"필드를 추가하고 데이터가 변경되면이 필드를 업데이트합니다. 그러나 자식 행 (FK 사용)이 수정 될 경우를 대비하여 일부 '부모'마지막 수정 행을 업데이트해야합니다.
주 테이블에서 MAX (마지막 수정 날짜)를 가져오고 관련 테이블에서 MAX를 가져 오면이 여러 값의 MAX가 작동하지만 약간 느립니다. 는 말은 :
MAX(MAX(MAIN_TABLE), MAX(CHILD1_TABLE), MAX(CHILD2_TABLE))
그래서 내가 전환과는 TBL_METADATA 테이블에서 필드를 업데이트 할 수 있도록이 테이블에 트리거를 추가 :
CREATE TABLE [TABLE_METADATA](
[TABLE_NAME] [nvarchar](250) NOT NULL,
[TABLE_LAST_MODIFICATION] [datetime] NOT NULL
지금 관련 테이블 마지막으로 '주'테이블을 업데이트 할 수 있습니다 수정 시간은 메타 데이터 테이블의 마지막 수정 만 업데이트하면됩니다. 마지막 수정 가져 오기가 이제는 빠릅니다.
하지만 ... 이제이 테이블을 업데이트하는 것과 관련하여 임의의 교착 상태가 발생했습니다.
이것은 다른 단계에서 TABLE_METADATA를 수정 한 다음 서로 잠그는 2 개의 트랜잭션 때문입니다.
내 질문 :이 마지막 수정 사항을 행을 잠그지 않고 유지하는 방법이 있습니까? 내 경우에는 정말 경우 걱정하지 않는다 :
- lastmodification는 트랜잭션이 롤백 경우에도 업데이트를 유지
- '더러운'lastmodification (업데이트 아직 확정되지 않음) 새 값으로 덮어 입니다
실제로 이러한 업데이트가 트랜잭션에 필요하지 않지만 트리거에 의해 실행되므로 현재 트랜잭션에 자동으로 적용됩니다.
도움 주셔서 감사합니다.
here. 당신은 같은 것을 사용하여 시도가 테이블 힌트에 대한
더 많은 문서를 찾을 수 NOLOCK 힌트? 그게 어떤 잠금 장치 광고를하지 않고 업데이 트됩니다 그 때문에 교착 상태가 발생해서는 안됩니다 – Antonio
내가 선택에 대한 NOLOCK 힌트를 알고 있지만 그것을 업데이트 할 때 사용할 수 있었는지 몰랐어? 나는 이것에 대해 확인해 보겠습니다. – Fabske
nevermind, SELECT 만 잊었습니다 ... 시도해보십시오. "INSERT, UPDATE의 대상 테이블에는 NOLOCK 및 READUNCOMMITTED 잠금 힌트가 허용되지 않습니다. , DELETE 또는 MERGE 문을. " – Antonio