Copy-on-Write-objectgrafiektransacties
THotPDF biedt geneste savepoints voor geladen of samengestelde indirecte-objectgrafieken zonder het document te klonen bij transactiestart
Transactielevenscyclus
PDF.BeginGraphTransaction('metadata edit');
try
Info.AddStringValue('Producer', 'HotPDF');
PDF.CommitGraphTransaction;
except
PDF.RollbackGraphTransaction;
raise;
end;
BeginGraphTransaction indexeert de huidige indirecte roots en installeert mutatie-observers maar creëert geen snapshots; de eerste schrijf naar een bestaande indirecte root in dat frame creëert één snapshot, en latere schrijfs naar dezelfde root hergebruiken deze
CommitGraphTransaction behoudt de huidige grafiek en verwijdert of draagt snapshots over zonder deze te klonen; RollbackGraphTransaction herstelt rootobjecten op hun plaats, verwijdert objecten die na het savepoint zijn toegevoegd en herstelt de objectnummer-toewijzing
Geneste transacties zijn onafhankelijke savepoints; een innerlijke rollback keert terug naar de innerlijke invoerstatus, terwijl een innerlijke commit voldoende geschiedenis behoudt voor een latere buitenste rollback
Automatische en expliciete schrijfvoorbereiding
THPDFDictionaryObject.AddValue, ReplaceValue en DeleteValue, THPDFArrayObject.AddObject en SetIndexedItem, en THPDFStreamObject.Length-wijzigingen melden automatisch de omringende indirecte root
Publieke scalaire velden en ruwe stroombytes kunnen toewijzing niet onderscheppen; roep PrepareLoadedObjectForWrite aan vóór het toewijzen van Value, het wijzigen van publieke objectvlaggen, het vervangen van grafiekwijzers of het schrijven via THPDFStreamObject.Stream
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;
Geheugen en prestaties
Snapshotgeheugen groeit met aangeraakte indirecte roots in plaats van de totale documentgrootte; grote stroompayloads verlopen naar eigendom tijdelijke bestanden na GraphTransactionMemoryThreshold, waarvan de standaard 16 MiB is
Rollback ruilt opgeslagen woordenlijstitems, arrayitems en stroomopslag terug in de bestaande root, waardoor een tweede diepe kopie wordt vermeden; de rootwijzer blijft stabiel, maar wijzers naar directe descendenten moeten na rollback opnieuw worden verkregen
GetGraphTransactionStatistics retourneert Active, nest-Depth, SnapshotCount, AddedObjectCount, residente en verlopen snapshotbytes en piek-residente snapshotbytes
THPDFBeforeMutationEvent is de laag-niveau observer-handtekening die wordt gebruikt om container- en levenscyclusmutaties naar de omringende indirecte-root-snapshot te leiden
Scope
Transacties dekken de indirecte-objectgrafiek, levenscyclusstatus, toegevoegde roots en objectnummer-toewijzing; door de aanroeper eigendommen wijzers, geladen-pagina-ordeningarrays, gerenderde caches en andere facade-zijstatus worden niet gelogd
Verwijder, herorder of vervang geen bestaande vermeldingen in GetLoadedIndirectObjects terwijl een transactie actief is; gebruik grafiekcontainermethoden en verkrijg directe descendenten opnieuw na rollback