Start · Sprachen · PHP · Referenz · MongoDB\Driver\ReadConcern

MongoDB\Driver\ReadConcern

Klasse

Legt das Konsistenzniveau (Read Concern Level) für Lesevorgänge in MongoDB-Abfragen fest.

seit PHP 1.0.0 Kategorie: db

Signatur

class MongoDB\Driver\ReadConcern implements MongoDB\BSON\Serializable, Serializable

Beschreibung

MongoDB\Driver\ReadConcern ermöglicht es, das Konsistenzniveau für Lesevorgänge in MongoDB zu kontrollieren. Damit lässt sich steuern, ob ein Lesevorgang Daten zurückliefert, die bereits auf eine Mehrheit der Replica-Set-Mitglieder repliziert wurden, oder ob auch noch nicht bestätigte Schreibvorgänge sichtbar sind.

Unterstützte Level sind unter anderem local (Standard), majority, linearizable, available und snapshot. Der Level majority stellt sicher, dass nur Daten gelesen werden, die von einer Mehrheit der Knoten bestätigt wurden – wichtig für konsistente Lesevorgänge in Replica Sets. linearizable bietet das stärkste Konsistenzversprechen auf Kosten der Latenz.

Ein ReadConcern-Objekt kann beim Erstellen von MongoDB\Driver\Query, MongoDB\Driver\Command oder beim Konfigurieren einer MongoDB\Driver\Session übergeben werden. Es arbeitet eng mit MongoDB\Driver\ReadPreference und MongoDB\Driver\WriteConcern zusammen, um das gewünschte Konsistenzverhalten einer Datenbankoperation vollständig zu beschreiben.

Die Klasse implementiert MongoDB\BSON\Serializable, sodass sie direkt in BSON-Dokumente serialisiert werden kann, und Serializable für PHP-eigene Serialisierung.

Parameter

Name Typ Default Beschreibung
$level string|null null Das gewünschte Read-Concern-Level als String. Gültige Werte sind Klassenkonstanten wie MongoDB\Driver\ReadConcern::LOCAL, MongoDB\Driver\ReadConcern::MAJORITY, MongoDB\Driver\ReadConcern::LINEARIZABLE, MongoDB\Driver\ReadConcern::AVAILABLE und MongoDB\Driver\ReadConcern::SNAPSHOT. Wird null übergeben oder der Parameter weggelassen, wird kein Level explizit gesetzt.

Beispiele

ReadConcern mit Level majority für eine Abfrage

<?php
$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');

// ReadConcern mit dem Level 'majority' erstellen
$readConcern = new MongoDB\Driver\ReadConcern(
    MongoDB\Driver\ReadConcern::MAJORITY
);

$queryOptions = [
    'readConcern' => $readConcern,
];

$query = new MongoDB\Driver\Query([], $queryOptions);

try {
    $cursor = $manager->executeQuery('testdb.users', $query);
    foreach ($cursor as $document) {
        var_dump($document);
    }
} catch (MongoDB\Driver\Exception\Exception $e) {
    echo 'Fehler: ' . $e->getMessage() . PHP_EOL;
}

ReadConcern in einer Session mit Transaktion verwenden

<?php
$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017/?replicaSet=rs0');

$sessionOptions = [
    'defaultTransactionOptions' => [
        'readConcern'  => new MongoDB\Driver\ReadConcern(
            MongoDB\Driver\ReadConcern::SNAPSHOT
        ),
        'writeConcern' => new MongoDB\Driver\WriteConcern(
            MongoDB\Driver\WriteConcern::MAJORITY
        ),
    ],
];

$session = $manager->startSession($sessionOptions);
$session->startTransaction();

try {
    $query = new MongoDB\Driver\Query(['status' => 'active']);
    $cursor = $manager->executeQuery(
        'testdb.orders',
        $query,
        ['session' => $session]
    );

    foreach ($cursor as $doc) {
        var_dump($doc);
    }

    $session->commitTransaction();
    echo 'Transaktion erfolgreich committet.' . PHP_EOL;
} catch (MongoDB\Driver\Exception\Exception $e) {
    $session->abortTransaction();
    echo 'Fehler, Transaktion abgebrochen: ' . $e->getMessage() . PHP_EOL;
}
Transaktion erfolgreich committet.

Level des ReadConcern auslesen

<?php
$readConcern = new MongoDB\Driver\ReadConcern(
    MongoDB\Driver\ReadConcern::LINEARIZABLE
);

echo 'Level: ' . $readConcern->getLevel() . PHP_EOL;

// ReadConcern ohne expliziten Level
$defaultConcern = new MongoDB\Driver\ReadConcern();
var_dump($defaultConcern->getLevel()); // NULL
Level: linearizable NULL

// Wichtig · Fallstricke

Kompatibilität: Nicht alle Read-Concern-Level werden von jeder MongoDB-Version oder jedem Deployment-Typ unterstützt. linearizable erfordert ein Replica Set und ist nur für Lesevorgänge auf dem Primary verfügbar. snapshot ist nur innerhalb von Multi-Document-Transaktionen verfügbar (ab MongoDB 4.0).

Performance: Höhere Konsistenzlevel wie majority oder linearizable können die Latenz erhöhen, da MongoDB auf die Bestätigung durch Replica-Set-Mitglieder warten muss. Verwende sie nur dort, wo Konsistenz kritischer ist als Geschwindigkeit.

Konstanten: Verwende stets die Klassenkonstanten (ReadConcern::MAJORITY etc.) statt hartcodierte Strings, um Tippfehler zu vermeiden und zukunftssicher zu bleiben.