Copy-on-Write 객체 그래프 트랜잭션

THotPDF는 트랜잭션 시작 시 문서를 복제하지 않고 로드된 또는 조립된 간접 객체 그래프에 중첩 저장 지점을 제공합니다

트랜잭션 수명 주기

PDF.BeginGraphTransaction('metadata edit');
try
  Info.AddStringValue('Producer', 'HotPDF');
  PDF.CommitGraphTransaction;
except
  PDF.RollbackGraphTransaction;
  raise;
end;

BeginGraphTransaction은 현재 간접 루트를 인덱싱하고 변경 관찰자를 설치하지만 스냅샷은 만들지 않습니다. 해당 프레임에서 기존 간접 루트에 대한 첫 번째 쓰기가 스냅샷 하나를 만들고, 같은 루트에 대한 이후 쓰기는 이를 재사용합니다

CommitGraphTransaction은 현재 그래프를 유지하고 복제하지 않고 스냅샷을 폐기하거나 전송하며, RollbackGraphTransaction은 루트 객체를 제자리에 복원하고 저장 지점 뒤에 추가된 객체를 제거하며 객체 번호 할당을 복원합니다

중첩 트랜잭션은 독립적인 저장 지점입니다. 내부 롤백은 내부 진입 상태로 돌아가고, 내부 커밋은 나중의 외부 롤백을 위해 충분한 기록을 유지합니다

자동 및 명시적 쓰기 준비

THPDFDictionaryObject.AddValue, ReplaceValue, DeleteValue, THPDFArrayObject.AddObject, SetIndexedItem, THPDFStreamObject.Length 변경은 포함하는 간접 루트에 자동으로 알립니다

공개 스칼라 필드와 원시 스트림 바이트는 할당을 가로챌 수 없으므로 Value를 할당하거나, 공개 객체 플래그를 변경하거나, 그래프 포인터를 교체하거나, THPDFStreamObject.Stream을 통해 쓸 때 PrepareLoadedObjectForWrite를 먼저 호출하십시오

PDF.BeginGraphTransaction('raw stream edit');
try
  PDF.PrepareLoadedObjectForWrite(StreamObject);
  StreamObject.Stream.Size:= 0;
  StreamObject.Stream.WriteBuffer(Bytes[0], Length(Bytes));
  StreamObject.Length:= Length(Bytes);
  PDF.CommitGraphTransaction;
except
  PDF.RollbackGraphTransaction;
  raise;
end;

메모리 및 성능

스냅샷 메모리는 총 문서 크기가 아니라 접촉한 간접 루트에 따라 증가하며, 큰 스트림 페이로드는 기본값이 16 MiB인 GraphTransactionMemoryThreshold 이후 소유 임시 파일로 넘겨집니다

롤백은 저장된 사전 항목, 배열 항목, 스트림 저장소를 기존 루트로 다시 바꿔 두 번째 깊은 복사를 피합니다. 루트 포인터는 안정적으로 유지되지만 직접 하위에 대한 포인터는 롤백 후 다시 획득해야 합니다

GetGraphTransactionStatistics는 Active, 중첩 Depth, SnapshotCount, AddedObjectCount, 상주 및 spill 스냅샷 바이트, 최고 상주 스냅샷 바이트를 반환합니다

THPDFBeforeMutationEvent는 컨테이너 및 수명 주기 변경을 포함하는 간접 루트 스냅샷으로 라우팅하는 데 사용되는 저수준 관찰자 서명입니다

범위

트랜잭션은 간접 객체 그래프, 수명 주기 상태, 추가된 루트, 객체 번호 할당을 다룹니다. 호출자 소유 포인터, 로드된 페이지 정렬 배열, 렌더링된 캐시, 기타 파사드 측 상태는 저널링되지 않습니다

트랜잭션이 활성화된 동안 GetLoadedIndirectObjects의 기존 항목을 제거, 재정렬 또는 교체하지 마십시오. 그래프 컨테이너 메서드를 사용하고 롤백 후 직접 하위를 다시 획득하십시오