التراجع
تصف خطط التراجع طريقة إلغاء عمليات دمج محددة بعد تطبيقها. وتُنشأ قبل التطبيق، باستخدام الصفوف الحية الدقيقة الموجودة مباشرةً قبل الكتابة.
لا تنشئ التراجع من لقطة الأساس وحدها. فالأساس هو السلف المشترك، وليس بالضرورة الحالة الحية التي يجري استبدالها.
إنشاء خطة تراجع
use Merql\Plan\ChangeGroupSelection;
use Merql\Rollback\RollbackPlanBuilder;
use Merql\Snapshot\SnapshotStore;
$selection = ChangeGroupSelection::fromIds([$plan->changeGroups[0]->id]);
$operationSelection = $selection->toOperationSelection($plan);
$expectedLive = SnapshotStore::load($plan->theirsSnapshot);
$liveBeforeRows = [];
foreach ($plan->operations as $operation) {
if (!$operationSelection->contains($operation->id)) {
continue;
}
$liveBeforeRows[$operation->id] = $expectedLive
->getTable($operation->table)
?->getRow($operation->rowKey);
}
$rollback = (new RollbackPlanBuilder())->build(
'rollback-1',
$plan,
$operationSelection,
$liveBeforeRows,
metadata: ['promotion_id' => 'promotion-1'],
);
تخزّن الخطة ما يلي:
- معرّف خطة الدمج،
- معرّفات العمليات المحددة،
- الجداول المتأثرة،
- العمليات العكسية،
- الصفوف السابقة،
- الصفوف المتوقعة بعد التطبيق،
- البيانات الوصفية،
- تجزئة التراجع،
- إصدار المخطط.
فحص الانحراف
قبل تطبيق التراجع، قارن الصفوف الحية الحالية بالصفوف المتوقعة بعد التطبيق في خطة التراجع. إذا تغير أي صف منذ الترقية، فألغِ العملية افتراضيًا.
use Merql\Rollback\RollbackDrift;
$currentRows = [
$operationId => $currentLiveRow,
];
$drifted = (new RollbackDrift())->driftedOperationIds($rollback, $currentRows);
if ($drifted !== []) {
throw new RuntimeException('Rollback drifted: ' . implode(', ', $drifted));
}
يقارن فحص الانحراف بصمات الصفوف، لذا لا يؤثر ترتيب الأعمدة.
تطبيق التراجع
عند عدم وجود انحراف، طبّق العمليات العكسية.
use Merql\Rollback\RollbackPlanApplier;
$applied = (new RollbackPlanApplier($connection))->apply($rollback);
if ($applied->hasErrors()) {
foreach ($applied->errors() as $error) {
echo $error . "\n";
}
}
يطبّق التراجع MergeResult عاديًا مُنشأً من العمليات العكسية. ويُنفّذ ضمن مسار التطبيق المعاملي نفسه المستخدم لتطبيق الدمج المعتاد.
التسلسل
احفظ خطط التراجع قبل تطبيق الدمج الأمامي. فهذا الأثر هو الأساس الدائم للتراجع لاحقًا.
use Merql\Rollback\RollbackPlanSerializer;
$json = RollbackPlanSerializer::toJson($rollback);
$restored = RollbackPlanSerializer::fromJson($json);
ينبغي للتطبيقات تخزين الخطة المتسلسلة مع العملية التي أجرت الكتابة الحية، إلى جانب أي بيانات تدقيق خاصة بالمضيف.