Liigu sisu juurde

Tagasipööramine

Tagasipööramisplaanid kirjeldavad, kuidas valitud liitmisoperatsioonid pärast rakendamist tagasi võtta. Need koostatakse enne rakendamist, kasutades täpseid aktiivseid ridu, mis on olemas vahetult enne kirjutamist.

Ärge looge tagasipööramisplaani ainult baashetktõmmise põhjal. Baas on ühine eellane, mitte tingimata ülekirjutatav aktiivne olek.

Tagasipööramisplaani koostamine

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

Plaan salvestab:

  • liitmisplaani ID,
  • valitud operatsioonide ID-d,
  • puudutatud tabelid,
  • pöördoperatsioonid,
  • algolekuread,
  • eeldatud lõppoleku read,
  • metaandmed,
  • tagasipööramise räsi,
  • skeemi versiooni.

Muudatuste kontroll

Enne tagasipööramise rakendamist võrrelge aktiivseid ridu tagasipööramisplaani eeldatud lõppoleku ridadega. Kui mõni rida on pärast juurutamist muutunud, katkestatakse toiming vaikimisi.

PHP
use Merql\Rollback\RollbackDrift;

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

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

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

Muudatuste kontroll võrdleb ridade sõrmejälgi, seega pole veergude järjestusel tähtsust.

Tagasipööramise rakendamine

Kui muudatusi pole, rakendage pöördoperatsioonid.

PHP
use Merql\Rollback\RollbackPlanApplier;

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

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

Tagasipööramine rakendab tavalise MergeResult, mis on koostatud pöördoperatsioonidest. See läbib sama tehingupõhise rakendamise protsessi nagu tavaline liitmise rakendamine.

Järjestamine

Salvestage tagasipööramisplaanid enne edasiliikuva liitmise rakendamist. See artefakt on hilisema tagasipööramise püsiv alus.

PHP
use Merql\Rollback\RollbackPlanSerializer;

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

Rakendused peaksid salvestama serialiseeritud plaani koos aktiivse kirjutamise teinud operatsiooniga ja kõigi hostipõhiste auditi metaandmetega.