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

MongoDB\Driver\WriteConcern

Klasse

Legt die geforderte Bestätigungsstufe für Schreiboperationen in MongoDB fest.

seit PHP 1.0.0 Kategorie: db

Signatur

class MongoDB\Driver\WriteConcern

Beschreibung

MongoDB\Driver\WriteConcern beschreibt, wie viele MongoDB-Knoten eine Schreiboperation bestätigen müssen, bevor der Treiber die Operation als erfolgreich ansieht. Dies ist essenziell für die Kontrolle von Datenkonsistenz und Ausfallsicherheit in Replikatmengen (Replica Sets) und Sharded Clusters.

Die Klasse ermöglicht es, verschiedene Bestätigungsstufen zu definieren: keine Bestätigung (w=0), Bestätigung durch den primären Knoten (w=1), Mehrheitsbescheid der stimmberechtigten Replikate (w='majority') oder eine benutzerdefinierte Anzahl von Knoten. Zusätzlich kann über den $journal-Parameter verlangt werden, dass Schreiboperationen in das Journal des primären Knotens eingetragen werden, bevor die Bestätigung erfolgt.

Ein WriteConcern-Objekt wird typischerweise bei der Instanziierung eines MongoDB\Driver\BulkWrite-Objekts, einer MongoDB\Driver\Session oder beim Ausführen von Operationen über den MongoDB\Driver\Manager übergeben. Die Auswahl der richtigen Stufe hängt von den Anforderungen an Konsistenz und Leistung ab — höhere Bestätigungsstufen erhöhen die Datensicherheit, können jedoch die Schreiblatenz steigern.

Das Objekt ist unveränderlich (immutable); nach der Erstellung können keine Eigenschaften mehr geändert werden.

Parameter

Name Typ Default Beschreibung
$w Pflicht int|string Bestätigungsstufe der Schreiboperation. Als int: Anzahl der Knoten, die bestätigen müssen (z. B. 0, 1). Als string: 'majority' für eine Mehrheitsbescheinigung oder ein benutzerdefinierter Tag-Set-Name. Die Konstanten MongoDB\Driver\WriteConcern::MAJORITY und MongoDB\Driver\WriteConcern::UNACKNOWLEDGED können verwendet werden.
$wtimeout int 0 Maximale Wartezeit in Millisekunden, bis die geforderte Bestätigungsstufe erreicht wurde. 0 bedeutet kein Timeout. Wird nur bei w > 1 oder w='majority' ausgewertet.
$journal bool null Wenn true, muss die Schreiboperation in das Journal des primären Knotens eingetragen worden sein, bevor die Bestätigung erfolgt. null lässt die Servereinstellung gelten.

Rückgabewert

Typ

Beispiele

Schreiben mit Mehrheitsbestätigung und Journal

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

// WriteConcern: Mehrheit der Replikate muss bestätigen, Journal-Eintrag erforderlich
$writeConcern = new MongoDB\Driver\WriteConcern(
    MongoDB\Driver\WriteConcern::MAJORITY,
    5000, // Timeout: 5 Sekunden
    true  // Journal muss bestätigt sein
);

$bulk = new MongoDB\Driver\BulkWrite();
$bulk->insert(['name' => 'Max Mustermann', 'email' => 'max@example.com']);

try {
    $result = $manager->executeBulkWrite('mydb.users', $bulk, ['writeConcern' => $writeConcern]);
    echo 'Eingefügte Dokumente: ' . $result->getInsertedCount() . PHP_EOL;
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
    echo 'Schreibfehler: ' . $e->getMessage() . PHP_EOL;
} catch (MongoDB\Driver\Exception\Exception $e) {
    echo 'Allgemeiner Fehler: ' . $e->getMessage() . PHP_EOL;
}
Eingefügte Dokumente: 1

Unbestätigte Schreiboperation (Fire & Forget)

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

// w=0: Keine Bestätigung erforderlich (Fire & Forget)
$writeConcern = new MongoDB\Driver\WriteConcern(0);

$bulk = new MongoDB\Driver\BulkWrite();
$bulk->insert(['event' => 'page_view', 'url' => '/home', 'ts' => time()]);

$result = $manager->executeBulkWrite('mydb.analytics', $bulk, ['writeConcern' => $writeConcern]);

// Bei w=0 ist getInsertedCount() nicht zuverlässig
echo 'Operation abgesendet (ohne Bestätigung).' . PHP_EOL;
Operation abgesendet (ohne Bestätigung).

WriteConcern-Eigenschaften auslesen

<?php
$wc = new MongoDB\Driver\WriteConcern(
    MongoDB\Driver\WriteConcern::MAJORITY,
    3000,
    true
);

echo 'w: '       . $wc->getW()         . PHP_EOL;
echo 'wtimeout: ' . $wc->getWtimeout()  . PHP_EOL;
echo 'journal: '  . var_export($wc->getJournal(), true) . PHP_EOL;
echo 'isDefault: ' . var_export($wc->isDefault(), true) . PHP_EOL;
w: majority wtimeout: 3000 journal: true isDefault: false

// Wichtig · Fallstricke

Datensicherheit vs. Leistung: Eine höhere Bestätigungsstufe (z. B. majority) erhöht die Datenkonsistenz, kann aber die Schreiblatenz spürbar erhöhen. Für nicht-kritische Daten wie Logs oder Metriken kann w=0 sinnvoll sein, da dort Datenverlust tolerierbar ist.

Achtung bei w=0: Bei unbestätigten Schreiboperationen werden Fehler (z. B. duplizierte Schlüssel) nicht zurückgemeldet. Dieses Muster sollte nur bewusst und nur für unkritische Daten eingesetzt werden.

Journal und Replica Sets: Der $journal-Parameter wird vom Server ignoriert, wenn journaling nicht aktiviert ist. Bei einer Standalone-Instanz ohne Journaling wird eine Exception geworfen, wenn journal=true und w=0 kombiniert werden.

Serialisierung: WriteConcern-Objekte implementieren MongoDB\BSON\Serializable und können mit serialize() und unserialize() persistiert werden.