Μετάβαση στο περιεχόμενο

Αναίρεση

Τα σχέδια αναίρεσης περιγράφουν πώς να αναιρέσετε επιλεγμένες ενέργειες συγχώνευσης αφού εφαρμοστούν. Δημιουργούνται πριν από την εφαρμογή, με βάση τις ακριβείς ενεργές γραμμές που υπάρχουν αμέσως πριν από την εγγραφή.

Μην δημιουργείτε αναίρεση μόνο από το στιγμιότυπο βάσης. Η βάση είναι ο κοινός πρόγονος, όχι απαραίτητα η ενεργή κατάσταση που αντικαθίσταται.

Δημιουργία σχεδίου αναίρεσης

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

Το σχέδιο αποθηκεύει:

  • το αναγνωριστικό του σχεδίου συγχώνευσης,
  • τα αναγνωριστικά των επιλεγμένων ενεργειών,
  • τους πίνακες που επηρεάζονται,
  • τις αντίστροφες ενέργειες,
  • τις γραμμές πριν από την αλλαγή,
  • τις αναμενόμενες γραμμές μετά την αλλαγή,
  • τα μεταδεδομένα,
  • ένα κατακερματισμένο αποτύπωμα αναίρεσης,
  • μια έκδοση σχήματος.

Έλεγχος αποκλίσεων

Πριν εφαρμόσετε την αναίρεση, συγκρίνετε τις τρέχουσες ενεργές γραμμές με τις αναμενόμενες γραμμές μετά την αλλαγή του σχεδίου αναίρεσης. Αν έχει αλλάξει οποιαδήποτε γραμμή από την προώθηση, η διαδικασία διακόπτεται από προεπιλογή.

PHP
use Merql\Rollback\RollbackDrift;

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

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

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

Ο έλεγχος αποκλίσεων συγκρίνει αποτυπώματα γραμμών, οπότε η σειρά των στηλών δεν έχει σημασία.

Εφαρμογή αναίρεσης

Όταν δεν υπάρχει απόκλιση, εφαρμόστε τις αντίστροφες ενέργειες.

PHP
use Merql\Rollback\RollbackPlanApplier;

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

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

Η αναίρεση εφαρμόζει ένα κανονικό MergeResult που δημιουργείται από αντίστροφες ενέργειες. Εκτελείται μέσω της ίδιας διαδρομής συναλλακτικής εφαρμογής με τη συνήθη εφαρμογή συγχώνευσης.

Σειριοποίηση

Αποθηκεύστε τα σχέδια αναίρεσης πριν εφαρμόσετε την προωθητική συγχώνευση. Αυτό το τεχνούργημα αποτελεί τη διαρκή βάση για μεταγενέστερη αναίρεση.

PHP
use Merql\Rollback\RollbackPlanSerializer;

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

Οι εφαρμογές θα πρέπει να αποθηκεύουν το σειριοποιημένο σχέδιο μαζί με την ενέργεια που πραγματοποίησε την ενεργή εγγραφή, καθώς και τυχόν μεταδεδομένα ελέγχου ειδικά για την εφαρμογή υποδοχής.