2014-04-30 2 views
0

CDC 테이블 중 하나를 살펴보면 __ $ start_lsn 값이 0x000CB13700041C06001B 인 테이블에 네 개의 행이 표시됩니다.

내 질문은 여기 있습니다. SQL Server가 CDC 테이블에이 lsn을 포함하는 네 개의 행을 썼을 때이 lsn을 가질 수있는 네 개의 행만 작성 했습니까? 아니면 다음 트랜잭션이 동일한 lsn을 가진 행을 더 포함 할 수 있습니까?

또는 다른 방법으로 말하자면 특정 LSN에서 CDC 테이블을 보거나 쿼리하면 같은 LSN을 사용하여 앞으로 더 많은 행을 볼 수 없습니다. ?

답변

2

는 지금까지이 LSN

예를 가지고있는 유일한 네 개의 행을 쓰기 않았다. 설명하는 방법을 고려하십시오. Querying for All New Changes Since the Last Set of Changes

일반적인 응용 프로그램의 경우 변경 데이터를 쿼리하면 진행중인 프로세스가되며 마지막 요청 이후에 발생한 모든 변경 사항이 주기적으로 요청됩니다. 이러한 쿼리의 경우 함수 sys.fn_cdc_increment_lsn을 사용하여 이전 쿼리의 상한값에서 현재 쿼리의 하한값을 유도 할 수 있습니다. 이 방법은 쿼리 간격이 항상 두 종점이 간격에 포함 된 닫힌 간격으로 처리되기 때문에 행이 반복되지 않도록합니다. 그런 다음 새 요청 간격에 대해 높은 끝점을 얻으려면 sys.fn_cdc_get_max_lsn 함수를 사용하십시오. 예제 코드에서 쿼리 창을 시스템으로 이동하여 으로 템플릿을 보내려면 이전 요청 이후의 모든 변경 내용 열거 형 템플릿을 참조하십시오.

(내 강조)

당신이보고있는 변화의 현재 설정을 넘어 이동하는 기술은 증가 현재 세트에서 가장 높은 LSN이다. 그런 다음 그것을 새로운 하위 경계로 사용합니다. 그리고 그것은 마지막 요청 이후 모두 변경을 얻는 방법으로 설명됩니다. 따라서 우리는 이미 본 것과 같은 변경 사항이있을 수 있다고 결론 지을 수 있습니다.

+0

감사합니다.LSN이 123 인 행 (테이블에 없을 것임)이 테이블에있는 경우 동일한 LSN을 가진 행을 더 이상 볼 수 없다는 것을 안심할 수 있습니다. 미래의 거래 또는 언제든지? –

0

Damien_The_Unbeliever의 탁월한 대답 외에도 LSN은 데이터베이스 내의 변경에 대한 기본적인 식별자입니다. 이 BOL Article에서 :

는 SQL Server 트랜잭션 로그의 모든 기록은 고유 로그 시퀀스 번호 (LSN)에 의해을 식별됩니다. LSN2가 LSN1보다 큰 경우 LSN2가 참조하는 로그 레코드에 의해 설명 된 변경이 로그 레코드 LSN에 의해 ​​설명 된 변경 후에 발생하도록 LSN이 정렬됩니다.

(강조 광산)

또한 두 번째 문장에서 다른 몇 가지를 추론 할 수있다. LSN의 고유 한 순서 성 (orderability)으로 인해 쿼리에서 쿼리 순서를 지정할 수 있으며 로그에 커밋 된 순서를 얻을 수 있습니다. LSN2 = LSN1 인 경우에도이 명령문의 고유성을 추론 할 수 있습니다. 그런 다음 해당 레코드가 동시에 로그에 커밋되었습니다.