Hi Andreas, hi Peter,
mysql> select GET_LOCK("lock2",10);
ist was anderes als
mysql_query('select get_lock("5007",1)');
Obiges ist der Kommandozeilenclient von MySQL, unten ist es eine PHP-Funktion die ausgeführt wird. Diese Funktion liefert selber kein Ergebnis, sondern wie Du sicher gelesen hast die Recource unter der das Ergebnis geholt werden kann. Sehe Dir die mysql_fetch_* Funktionen an, komisch dass Du ausgerechnet das überlesen hast?!
Das ist sicher meine Schuld gewesen gestern. Ich habe Peter nur einen halben Tipp gegeben und ihn nicht selbst ausprobiert. Dann wäre mir nämlich mein Fehler aufgefallen. Tut mir leid, Peter.
Also nochmal pseudocode
function checked_insert($data,$table,$con)
$res = select get_lock("insert",10);
if (!$res) return ....Datenbankfehler
$ins_OK = mysql_fetch_row($res);
if (!ins_OK[0]==1) return ... Pech gehabt, komm später wieder
...
Einfügeoperationen
Selects
Berechnungen
Updateoperationen
...
$res = select release_lock("insert",10);
if (!$res) return ....ganz schwerer Datenbankfehler bei Freigabe
$release_OK = mysql_fetch_row($res);
if (!release_OK[0]) return ... Fehlercode wg. Freigabefehler
Ende -----
Du solltest Dir für bestimmte Operationen verschiedene Lock-Klassen überlegen. Eine einfache Einfügeoperation in eine einzige alleinstehende Tabelle kann dann z.B. nur eine einzige Lockklasse ansprechen, während eine komplexere Update-Funktion mehrere Locks benutzt. Nur wenn alle Locks erfolgreich sind, kann die Änderung durchgeführt werden. Man darf nur auf keinen Fall vergessen, de Locks wieder freizugeben.
Ich hoffe, nun klappts.
Ich habe auf jeden Fall seleber noch mal ne Anregung draus gezogen aus unserem Trilog
Grüße
Tom