Copy-on-Write Object Graph Transactions

THotPDF cung cấp các savepoint lồng nhau cho đồ thị đối tượng gián tiếp đã nạp hoặc đã lắp ráp mà không nhân bản tài liệu khi bắt đầu giao dịch

Vòng đời giao dịch

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

BeginGraphTransaction lập chỉ mục các gốc gián tiếp hiện tại và cài đặt bộ quan sát đột biến nhưng không tạo ảnh chụp nào; lần ghi đầu tiên vào một gốc gián tiếp hiện có trong khung đó tạo một ảnh chụp, và các lần ghi sau vào cùng gốc tái sử dụng nó

CommitGraphTransaction giữ đồ thị hiện tại và loại bỏ hoặc chuyển các ảnh chụp mà không nhân bản nó; RollbackGraphTransaction khôi phục các đối tượng gốc tại chỗ, loại bỏ các đối tượng được nối sau savepoint, và khôi phục cấp phát số đối tượng

Giao dịch lồng nhau là các savepoint độc lập; một lần rollback trong khôi phục về trạng thái vào trong, trong khi một lần commit trong giữ đủ lịch sử cho một lần rollback ngoài sau đó

Chuẩn bị ghi tự động và tường minh

THPDFDictionaryObject.AddValue, ReplaceValue, và DeleteValue, THPDFArrayObject.AddObject và SetIndexedItem, và các thay đổi THPDFStreamObject.Length thông báo gốc gián tiếp bao quanh một cách tự động

Trường vô hướng công khai và byte stream thô không thể chặn phép gán; hãy gọi PrepareLoadedObjectForWrite trước khi gán Value, thay đổi cờ đối tượng công khai, thay thế con trỏ đồ thị, hoặc ghi qua 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;

Bộ nhớ và hiệu năng

Bộ nhớ ảnh chụp tăng theo các gốc gián tiếp bị chạm thay vì kích thước tài liệu tổng thể; payload stream lớn tràn ra các tệp tạm thuộc sở hữu sau GraphTransactionMemoryThreshold, mặc định của nó là 16 MiB

Rollback hoán đổi các mục dictionary, mục mảng, và lưu trữ stream đã lưu trở lại gốc hiện có, tránh một bản sao sâu thứ hai; con trỏ gốc vẫn ổn định, nhưng con trỏ đến các hậu duệ trực tiếp phải được lấy lại sau rollback

GetGraphTransactionStatistics trả về Active, Depth lồng nhau, SnapshotCount, AddedObjectCount, byte ảnh chụp thường trú và tràn, và byte ảnh chụp thường trú đỉnh

THPDFBeforeMutationEvent là chữ ký bộ quan sát cấp thấp được dùng để định tuyến các đột biến container và vòng đời đến ảnh chụp gốc gián tiếp bao quanh

Phạm vi

Giao dịch bao phủ đồ thị đối tượng gián tiếp, trạng thái vòng đời, gốc được nối, và cấp phát số đối tượng; con trỏ do caller sở hữu, mảng thứ tự trang đã nạp, cache đã dựng, và trạng thái phụ khác của facade không được ghi nhật ký

Đừng xóa, sắp xếp lại, hoặc thay thế các mục hiện có trong GetLoadedIndirectObjects khi một giao dịch đang hoạt động; hãy dùng các phương thức container đồ thị và lấy lại các hậu duệ trực tiếp sau rollback