Signatur
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
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 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);
?>
// 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)).