İçeriğe geç

Geri Alma

Geri alma planları, seçili birleştirme işlemleri uygulandıktan sonra bunları nasıl geri alacağını açıklar. Yazma işleminden hemen önce var olan tam canlı satırlar kullanılarak uygulamadan önce oluşturulur.

Geri almayı yalnızca temel anlık görüntüden oluşturmayın. Taban ortak atadır ve üzerine yazılacak canlı durum olmak zorunda değildir.

Geri Alma Planı Oluşturma

PHP
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'],
);

Plan şunları saklar:

  • birleştirme planı kimliği,
  • seçili işlem kimlikleri,
  • etkilenen tablolar,
  • ters işlemler,
  • önceki satırlar,
  • beklenen sonraki satırlar,
  • meta veriler,
  • geri alma özeti,
  • şema sürümü.

Değişiklik Denetimi

Geri almayı uygulamadan önce mevcut canlı satırları, geri alma planında beklenen sonraki satırlarla karşılaştırın. Tanıtımdan bu yana herhangi bir satır değiştiyse varsayılan olarak işlemi iptal edin.

PHP
use Merql\Rollback\RollbackDrift;

$currentRows = [
    $operationId => $currentLiveRow,
];

$drifted = (new RollbackDrift())->driftedOperationIds($rollback, $currentRows);

if ($drifted !== []) {
    throw new RuntimeException('Rollback drifted: ' . implode(', ', $drifted));
}

Değişiklik denetimi satır parmak izlerini karşılaştırır; bu nedenle sütun sırası önemli değildir.

Geri Almayı Uygulama

Değişiklik yoksa ters işlemleri uygulayın.

PHP
use Merql\Rollback\RollbackPlanApplier;

$applied = (new RollbackPlanApplier($connection))->apply($rollback);

if ($applied->hasErrors()) {
    foreach ($applied->errors() as $error) {
        echo $error . "\n";
    }
}

Geri alma, ters işlemlerden oluşturulan normal bir MergeResult öğesini uygular. Normal birleştirme uygulamasıyla aynı işlemsel uygulayıcı yolunda çalışır.

Serileştirme

İleri birleştirmeyi uygulamadan önce geri alma planlarını kalıcı olarak saklayın. Bu kayıt, daha sonra geri alma işleminin kalıcı temelidir.

PHP
use Merql\Rollback\RollbackPlanSerializer;

$json = RollbackPlanSerializer::toJson($rollback);
$restored = RollbackPlanSerializer::fromJson($json);

Uygulamalar, serileştirilmiş planı canlı yazma işlemini gerçekleştiren işlemle ve ana makineye özgü denetim meta verileriyle birlikte saklamalıdır.