Start · Sprachen · PHP · Referenz · cubrid_lock_read

cubrid_lock_read

Funktion

Setzt eine Lesesperre auf ein durch eine OID identifiziertes Objekt in einer CUBRID-Datenbank.

seit PHP 8.3.1 Kategorie: db

Signatur

cubrid_lock_read(resource $conn_identifier, string $oid): bool

Beschreibung

cubrid_lock_read sperrt ein einzelnes Datenbankobjekt (Tupel) in einer CUBRID-Datenbank zum Lesen. Durch das Setzen einer Lesesperre (Shared Lock) wird sichergestellt, dass kein anderer Prozess das Objekt schreibend verändern kann, solange die Sperre aktiv ist – gleichzeitiges Lesen durch mehrere Transaktionen bleibt jedoch erlaubt.

Die Funktion ist nützlich in Transaktions-Szenarien, in denen konsistente Lesevorgänge garantiert werden müssen, ohne andere Leser zu blockieren. Sie kommt typischerweise zum Einsatz, wenn Daten zunächst gelesen und auf Basis dieser Leseoperation später eine Entscheidung getroffen wird, die eine exklusive Schreibsperre erfordert.

Eine Lesesperre bleibt bis zum Ende der aktuellen Transaktion aktiv, d. h. bis cubrid_commit oder cubrid_rollback aufgerufen wird. Es ist daher wichtig, Transaktionen zügig abzuschließen, um Deadlocks oder lange Sperrzeiten zu vermeiden.

Die OID (Object Identifier) identifiziert das zu sperrende Objekt eindeutig und wird üblicherweise über cubrid_insert_id oder durch Abfragen des oid-Feldes ermittelt.

Parameter

Name Typ Default Beschreibung
$conn_identifier Pflicht resource Die CUBRID-Verbindungsressource, die durch cubrid_connect oder cubrid_connect_with_url erzeugt wurde.
$oid Pflicht string Die OID (Object Identifier) des zu sperrenden Datenbankobjekts, z. B. @620|1|17. Sie identifiziert das Tupel in der CUBRID-Datenbank eindeutig.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Lesesperre erfolgreich gesetzt wurde. Gibt false zurück, wenn ein Fehler aufgetreten ist, z. B. bei einer ungültigen OID oder Verbindungsressource.

Beispiele

Lesesperre auf ein Objekt setzen und Daten lesen

<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');

if (!$conn) {
    die('Verbindung fehlgeschlagen: ' . cubrid_error());
}

// Transaktion starten (Auto-Commit deaktivieren)
cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE);

// OID eines bekannten Objekts (z. B. aus vorherigem INSERT oder SELECT)
$oid = '@620|1|17';

// Lesesperre setzen
if (cubrid_lock_read($conn, $oid)) {
    echo "Lesesperre erfolgreich gesetzt auf OID: $oid" . PHP_EOL;

    // Objekt lesen
    $result = cubrid_get($conn, $oid);
    if ($result) {
        print_r($result);
    } else {
        echo 'Fehler beim Lesen: ' . cubrid_error($conn);
    }
} else {
    echo 'Fehler beim Setzen der Lesesperre: ' . cubrid_error($conn);
}

// Transaktion abschließen
cubrid_commit($conn);
cubrid_disconnect($conn);
?>
Lesesperre erfolgreich gesetzt auf OID: @620|1|17 Array ( [name] => Max Mustermann [age] => 30 )

Lesesperre in Kombination mit Schreibsperre für sicheres Update

<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE);

$oid = '@620|1|42';

// Zuerst Lesesperre setzen, um konsistente Daten zu lesen
if (cubrid_lock_read($conn, $oid)) {
    $data = cubrid_get($conn, $oid);
    echo 'Aktueller Wert: ' . $data['balance'] . PHP_EOL;

    // Entscheidung basierend auf gelesenen Daten:
    // Jetzt Schreibsperre setzen, um zu aktualisieren
    if (cubrid_lock_write($conn, $oid)) {
        $newBalance = $data['balance'] + 100;
        cubrid_put($conn, $oid, 'balance', $newBalance);
        echo 'Neuer Wert: ' . $newBalance . PHP_EOL;
        cubrid_commit($conn);
    } else {
        echo 'Schreibsperre fehlgeschlagen.' . PHP_EOL;
        cubrid_rollback($conn);
    }
} else {
    echo 'Lesesperre fehlgeschlagen.' . PHP_EOL;
    cubrid_rollback($conn);
}

cubrid_disconnect($conn);
?>
Aktueller Wert: 500 Neuer Wert: 600

// Wichtig · Fallstricke

Deadlock-Gefahr: Das Upgrade von einer Lesesperre zu einer Schreibsperre innerhalb derselben Transaktion kann zu Deadlocks führen, wenn zwei Transaktionen gleichzeitig versuchen, dieselbe Lesesperre auf eine Schreibsperre zu erhöhen. Achte darauf, Transaktionen kurz zu halten und Sperren in einer konsistenten Reihenfolge zu setzen.

Verbindungsmodus: cubrid_lock_read ist nur verfügbar, wenn die Verbindung im OID-fähigen Modus betrieben wird (nicht bei CCI-Treiber-basierten Verbindungen ohne OID-Unterstützung).

Auto-Commit: Im Auto-Commit-Modus wird die Sperre sofort nach der Operation wieder freigegeben. Um die Sperre für eine längere Transaktion zu halten, muss Auto-Commit deaktiviert werden (cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE)).