Copy-on-Write-objektgraf-transaktioner
THotPDF tillhandahåller nästlade savepoints för inlästa eller sammansatta indirekta-objektgrafer utan att klona dokumentet vid transaktionsstart
Transaktionslivscykel
PDF.BeginGraphTransaction('metadata edit');
try
Info.AddStringValue('Producer', 'HotPDF');
PDF.CommitGraphTransaction;
except
PDF.RollbackGraphTransaction;
raise;
end;
BeginGraphTransaction indexerar de aktuella indirekta rötterna och installerar muteringsobservatörer men skapar inga snapshots; den första skrivningen till en befintlig indirekt rot i den ramen skapar en snapshot, och senare skrivningar till samma rot återanvänder den
CommitGraphTransaction behåller den aktuella grafen och slänger eller överför snapshots utan att klona den; RollbackGraphTransaction återställer rotobjekt på plats, tar bort objekt som lagts till efter savepointen och återställer objektnummerallokering
Rollback ogiltigförklarar cachen för inlästa formulärrelationer innan objekten återställs, så att senare fältuppslag byggs om från den återställda grafen i stället för att behålla referenser till borttagna fält eller widgetar
Nästlade transaktioner är oberoende savepoints; en inre rollback återgår till det inre ingångstillståndet, medan en inre commit behåller tillräckligt mycket historik för en senare yttre rollback
Automatisk och explicit skrivförberedelse
THPDFDictionaryObject.AddValue, ReplaceValue och DeleteValue, THPDFArrayObject.AddObject och SetIndexedItem samt THPDFStreamObject.Length-ändringar meddelar den omslutande indirekta roten automatiskt
Offentliga skalärfält och råa strömbytes kan inte fånga upp tilldelning; anropa PrepareLoadedObjectForWrite före tilldelning av Value, ändring av offentliga objektflaggor, ersättning av grafpekare eller skrivning genom 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;
Minne och prestanda
Snapshotminne växer med berörda indirekta rötter i stället för total dokumentstorlek; stora strömnyttolaster spills till ägda temporära filer efter GraphTransactionMemoryThreshold, vars standardvärde är 16 MiB
Rollback byter tillbaka sparade ordliste-poster, arrayelement och strömlagring in i den befintliga roten, vilket undviker en andra djupkopiering; rotpekaren förblir stabil, men pekare till direkta avkomlingar måste återanskaffas efter rollback
GetGraphTransactionStatistics returnerar Active, nästlings-Depth, SnapshotCount, AddedObjectCount, residenta och spillda snapshotbytes samt topp-residenta snapshotbytes
THPDFBeforeMutationEvent är den lågnivåobservatörssignaturen som används för att dirigera behållar- och livscykelmutationer till den omslutande indirekta-rot-snapshoten
Omfattning
Transaktioner täcker den indirekta objektgrafen, livscykeltillstånd, tillagda rötter och objektnummerallokering; anropare-ägda pekare, sid-ordningsarrayer för inlästa sidor, renderade cachear och annat fasadsidstillstånd journalförs inte
Ta inte bort, omordna eller ersätt befintliga poster i GetLoadedIndirectObjects medan en transaktion är aktiv; använd grafbehållarmetoder och återanskaffa direkta avkomlingar efter rollback