Signatur
Beschreibung
cubrid_lock_write sperrt ein bestimmtes Datenbankobjekt in CUBRID für Schreibzugriffe (exklusive Sperre). Durch die Schreibsperre wird verhindert, dass andere Transaktionen dasselbe Objekt gleichzeitig lesen oder verändern, bis die aktuelle Transaktion abgeschlossen oder zurückgerollt wurde.
Diese Funktion ist besonders nützlich, wenn mehrere Benutzer oder Prozesse gleichzeitig auf dieselben Datensätze zugreifen und man sicherstellen möchte, dass kritische Schreiboperationen atomar und konsistent ablaufen. Im Unterschied zur Lesesperre (cubrid_lock_read) blockiert die Schreibsperre sowohl Lese- als auch Schreibzugriffe anderer Transaktionen.
Die Sperre bleibt aktiv, bis die Transaktion durch cubrid_commit oder cubrid_rollback beendet wird. Die OID (Object Identifier) identifiziert das zu sperrende Objekt eindeutig und wird typischerweise über cubrid_insert oder Abfragen an das CUBRID-System ermittelt.
Diese Funktion steht ausschließlich für CUBRID-Datenbanken zur Verfügung und hat kein direktes Äquivalent in anderen PHP-Datenbankschnittstellen wie MySQLi oder PDO.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $conn_identifier Pflicht | resource | Die CUBRID-Verbindungsressource, die durch cubrid_connect oder cubrid_connect_with_url zurückgegeben wurde. |
|
| $oid Pflicht | string | Die OID (Object Identifier) des Objekts, auf das die Schreibsperre gesetzt werden soll. Die OID hat typischerweise das Format @page_no|slot_no|volume_no. |
Rückgabewert
true zurück, wenn die Schreibsperre erfolgreich gesetzt wurde. Im Fehlerfall (z. B. ungültige Verbindung oder OID) wird false zurückgegeben.Beispiele
Schreibsperre auf ein CUBRID-Objekt setzen
<?php
// Verbindung zur CUBRID-Datenbank herstellen
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
if (!$conn) {
die('Verbindung fehlgeschlagen: ' . cubrid_error());
}
// OID eines bekannten Datensatzes (z. B. aus einer vorherigen Abfrage)
$oid = '@620|1|0';
// Schreibsperre setzen
$result = cubrid_lock_write($conn, $oid);
if ($result) {
echo "Schreibsperre erfolgreich gesetzt.\n";
// Hier können exklusive Schreiboperationen durchgeführt werden
// ...
// Transaktion abschließen und Sperre freigeben
cubrid_commit($conn);
echo "Transaktion committed, Sperre freigegeben.\n";
} else {
echo "Fehler beim Setzen der Schreibsperre: " . cubrid_error($conn) . "\n";
cubrid_rollback($conn);
}
cubrid_disconnect($conn);
?>
Schreibsperre nach OID-Ermittlung aus Abfrage
<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
if (!$conn) {
die('Verbindung fehlgeschlagen.');
}
// Abfrage, um die OID eines bestimmten Datensatzes zu ermitteln
$req = cubrid_execute($conn, 'SELECT db_object(o) FROM nation o WHERE code = \'KOR\'', CUBRID_INCLUDE_OID);
if ($req) {
$oid = cubrid_current_oid($req);
echo "Gefundene OID: $oid\n";
// Schreibsperre auf diesen Datensatz setzen
if (cubrid_lock_write($conn, $oid)) {
echo "Schreibsperre auf OID $oid gesetzt.\n";
// Daten des Objekts lesen und manipulieren
$data = cubrid_get($conn, $oid);
echo "Datensatz geladen: " . print_r($data, true) . "\n";
// Änderungen speichern
cubrid_commit($conn);
} else {
echo "Fehler beim Sperren: " . cubrid_error($conn) . "\n";
cubrid_rollback($conn);
}
cubrid_close_request($req);
}
cubrid_disconnect($conn);
?>
// Wichtig · Fallstricke
Deadlock-Gefahr: Wenn mehrere Transaktionen gegenseitig Sperren aufeinander setzen, kann es zu einem Deadlock kommen. CUBRID erkennt Deadlocks und bricht eine der beteiligten Transaktionen ab. Es empfiehlt sich, Sperren immer in einer konsistenten Reihenfolge zu setzen und Transaktionen so kurz wie möglich zu halten.
Sperrfreigabe: Die Schreibsperre wird nicht manuell freigegeben, sondern immer erst am Ende der Transaktion durch cubrid_commit oder cubrid_rollback. Lange offene Transaktionen können andere Prozesse dauerhaft blockieren.
OID-Validität: Eine OID kann ungültig werden, wenn das referenzierte Objekt zwischenzeitlich gelöscht wurde. In diesem Fall schlägt cubrid_lock_write fehl und gibt false zurück.