ธุรกรรมกราฟวัตถุแบบ 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 แจ้งรากทางอ้อมที่ล้อมรอบโดยอัตโนมัติ
ฟิลด์สเกลาร์สาธารณะและไบต์สตรีมดิบไม่สามารถสกัดกั้นการกำหนดได้ เรียก PrepareLoadedObjectForWrite ก่อนกำหนด Value เปลี่ยนแฟล็กวัตถุสาธารณะ แทนที่พอยน์เตอร์กราฟ หรือเขียนผ่าน 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;
หน่วยความจำและประสิทธิภาพ
หน่วยความจำสแนปชอตเติบโตตามรากทางอ้อมที่ถูกแตะต้องมากกว่าขนาดเอกสารทั้งหมด เพย์โหลดสตรีมขนาดใหญ่ล้นไปยังไฟล์ชั่วคราวที่เป็นเจ้าของหลัง GraphTransactionMemoryThreshold ซึ่งค่าเริ่มต้นคือ 16 MiB
การย้อนกลับสลับรายการพจนานุกรม รายการอาร์เรย์ และที่เก็บสตรีมที่บันทึกกลับเข้าสู่รากที่มีอยู่โดยหลีกเลี่ยงการคัดลอกลึกครั้งที่สอง พอยน์เตอร์รากยังคงเสถียร แต่ต้องขอพอยน์เตอร์ไปยังลูกหลานตรงใหม่หลังการย้อนกลับ
GetGraphTransactionStatistics ส่งคืน Active, ความลึกการซ้อน Depth, SnapshotCount, AddedObjectCount, ไบต์สแนปชอตที่อยู่ในหน่วยความจำและที่ล้น และไบต์สแนปชอตสูงสุดในหน่วยความจำ
THPDFBeforeMutationEvent คือลายเซ็นตัวสังเกตระดับต่ำที่ใช้เพื่อส่งการกลายพันธุ์ของคอนเทนเนอร์และวงจรชีวิตไปยังสแนปชอตของรากทางอ้อมที่ล้อมรอบ
ขอบเขต
ธุรกรรมครอบคลุมกราฟวัตถุทางอ้อม สถานะวงจรชีวิต รากที่ผนวก และการจัดสรรหมายเลขวัตถุ พอยน์เตอร์ที่ผู้เรียกเป็นเจ้าของ อาร์เรย์การเรียงลำดับหน้าที่โหลดแล้ว แคชที่แสดงผล และสถานะข้าง facade อื่น ๆ ไม่ถูกจดบันทึก
อย่าลบ จัดลำดับใหม่ หรือแทนที่รายการที่มีอยู่ใน GetLoadedIndirectObjects ในขณะที่ธุรกรรมแอ็กทีฟ ใช้เมธอดคอนเทนเนอร์ของกราฟและขอลูกหลานตรงอีกครั้งหลังการย้อนกลับ