php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.02.2010, 10:52   #1 (permalink)
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard LOCK tables...

Hm.
Ich häng' grad bissl in der Luft.

Mag mir jemand die grundlegende Vorgehensweise kurz skizzieren,
wie ich vorgehen muss, damit ich einem User für eine bestimmte
Zeit alleinigen Schreib-Zugriff auf eine Tabelle geben kann und
andere User, die schreibend darauf zugreifen möchten, derweil
warten lasse... das php Script für diese User also solange in eine
Schleife oder etwas schicke, bis das Lock aufgehoben ist?
(So stell ich mir die Realisierung zumindest vor)

Latsch hier die Bibliothek ab und bemüh google... aber so richtig
'nen Durchblick krieg ich nicht.
Grad was das Zusammenspiel von MySQL und PHP in der Sache
angeht...
Samhayne ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.02.2010, 13:24   #2 (permalink)
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 441
erc befindet sich auf einem aufstrebenden Ast
erc eine Nachricht über ICQ schicken
Standard

Du willst ein LOCK über mehrere Http-Requests hinweg? Dafür gibts kein Hausmittel seitens Mysql. Das musst du selbst implementieren, entweder Cleintseitig oder in Form von proceduren in Mysql.
erc ist offline   Mit Zitat antworten
Alt 08.02.2010, 17:09   #3 (permalink)
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Nene... Datenbank öffnen, Table locken, drauf schreiben, Datenbank wieder schließen, lock aufheben.

Frage ist, wie ich die anderen Leute derweil auf die Wartebank setze...
Samhayne ist offline   Mit Zitat antworten
Alt 08.02.2010, 17:17   #4 (permalink)
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 21.292
PHP-Kenntnisse:
Fortgeschritten
nikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblick
Standard

Warum müssen die denn warten?
__________________
--
„Eins ist Fakt: Gescannt wird nackt!“

Privatsphäre 2.0 - Nacktscanner mit Eyetracking.
Unser Flugzeug darf kein geschlechtsfreier Raum sein.
--
nikosch ist offline   Mit Zitat antworten
Alt 08.02.2010, 17:45   #5 (permalink)
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Weil sie eventuell Updates an der Tabelle vornehmen müssen, die der User zuvor noch nicht gemacht hat.

Arbeiten beide gleichzeitig darauf gibt's aber böse Überschneidungen.



Hab mir eigentlich eingebildet, daß sowas 'n Standardproblem ist. *kopfkratz*
Auszuschließen, daß mehrere User gleichzeitig auf 'ner Tabelle rumorgeln und dem zweiten User nicht nur'n Fehler in's Gesicht zu werfen.
(K.a. was passiert, wenn ein User auf eine ge-LOCK-te Tabelle schreibend zugreifen will, ich geh aber mal von 'nem Fehler aus...).
Samhayne ist offline   Mit Zitat antworten
Alt 08.02.2010, 17:48   #6 (permalink)
Erfahrener Benutzer
 
Registriert seit: 26.07.2006
Beiträge: 121
JumperII
Standard

Hallo,

das ganze ist mit mysql_query zu realisieren. Als Aufruf musst Du dann die entsprechenden MYSQL spezifischen SQL-Kommandos nacheinander abarbeiten.
Code:
mysql_query( "LOCK TABLES mytable; INSERT INTO ..... ; UNLOCK TABLES mytable");
Allerdings ist das ganze etwas fragwürdig. Wenn DU nur Daten aktualisieren willst, solltest Du besser mit Transaktionen arbeiten. Bei denen werden alle betroffenen Zeilen in den Tabellen gesperrt, bis Du per commit die Transaktion beendest.
Eine andere Alternative ist, dass Du Dir in einer separaten Tabelle ein Semaphoren-Speicher baust, mit dem Du gleichzeitig Sperre und Queue der Abarbeitungsfolgen hinterlegst. Dazu legst Du bei Start einer Abfrage einen Entrag an und nach Ende löschst Du ihn. Außerdem markierst Du, ob Du Exklusiv oder Shared zugreifen willst. Soll Exklusiv zugegriffen werden, prüfst Du, ob niemand jemand bereits exklusiv arbeitet und ob du an erster Stelle stehst. Dann markierst Du Dich als aktiv, prüfst, ob alle shared actions abgearbeitet wurden und führst dann Deine exklusiven Befehle aus. Anschließend entfernst Du den Eintrag ...
Das ganze sollte auch noch eine Timeout-Überprüfung der Einträge enthalten.

Gruß,
Jumper, the II.
JumperII ist offline   Mit Zitat antworten
Alt 08.02.2010, 17:55   #7 (permalink)
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 21.292
PHP-Kenntnisse:
Fortgeschritten
nikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblicknikosch ist ein wunderbarer Anblick
Standard

Ich frage deshalb, weil es bspw. READ und WRITE Locks gibt, weil die Anzahl der beteiligten Tabellen relevant ist, mySql auch vieles selbst löst und mit InnoDB sogar noch ein Stück besser. Deine Frage ist also schlicht zu allgemein geschrieben.
__________________
--
„Eins ist Fakt: Gescannt wird nackt!“

Privatsphäre 2.0 - Nacktscanner mit Eyetracking.
Unser Flugzeug darf kein geschlechtsfreier Raum sein.
--
nikosch ist offline   Mit Zitat antworten
Alt 08.02.2010, 18:59   #8 (permalink)
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

@JumperII:

Zum Zeitpunkt zu der ich die Tabelle sperren möchte, weiß ich noch nicht, wieviele Einträge ich verändern muss... leider.

So kann ich auch nicht alles in einen Ausdruck packen.

An einen Sempahorenwert hatte ich tatsächlich auch schon gedacht.
Sah hier nur die Gefahr, daß wieder zwei gleichzeitig die Tabelle sperren. (wenn's ganz dumm läuft)
Bei Lock hätte ich noch eine Art Rückgabe erwartet, die mir sagt ob das Locken für mich erfolgreich war.

So bleibt für mich aber dann weiterhin das Problem... wie lasse ich die User warten, die grad auch schreiben wollen?
Ich trau dem Braten nicht, wenn ich checke ob ein Semaphor gesetzt ist und wenn nicht, dann einen setze. Auch hier könnten ja zwei User gleichzeitig auf die Idee kommen.

Dachte an irgendwas wie...

PHP-Code:
function update()
{
   if (
funkymysql_lock_table("table_haumiblau"$db)) 
   {
      
//do table updates

   
}
   else
   {
      
sleep(0.5);
      
update();
   }


Dazu noch'n Timeout + wenn Timeout, dann Reset des Semaphors und anschließend Tabellenvalidierung (ich denk mal, das meintest Du).

Hmm... ich könnte in den Sempahor natürlich noch die User_id mit einbauen.
Dann wär's eindeutig.

1) Check ob Semaphor gesetzt
2) Wenn nicht, setze meine user_id + Rechte
3) SELECT: wenn MEINE user_id + Rechte gesetzt, leg los...

Das ganze am besten in einem Aufwasch... *kopfkratz*
Vielleicht mit einem mysqli_multi_query()?
Ich hoffe, da kann dann nicht nochmal ein User dazwischen...

Denk ich zu kompliziert?





@nikosch:

Es sind 3 Tabellen... wobei es schon reichen würde, eine zu sperren und die anderen user solange warten zu lassen.

Geändert von Samhayne (08.02.2010 um 19:11 Uhr).
Samhayne ist offline   Mit Zitat antworten
Alt 08.02.2010, 19:56   #9 (permalink)
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 485
PHP-Kenntnisse:
Fortgeschritten
Frank ist zur Zeit noch ein unbeschriebenes Blatt
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard

Was spricht denn gegen die genannten Transactions ?
__________________
Frank ist offline   Mit Zitat antworten
Alt 08.02.2010, 20:42   #10 (permalink)
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Ich hatte JumperII falsch verstanden... ich hab mir Transactions bisher noch nicht angeguckt.
Werd' ich morgen mal tun...

Wie handle ich es dann da, daß die anderen User warten bis die Transaction beendet ist,
so daß die danach ihre machen können?
Samhayne ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] mysql_insert_id () und LOCK TABLES Senifor PHP Einsteiger 2 29.10.2009 15:40
[Erledigt] breadcrumb 2 Tables mit Subcategories fulltilt PHP Einsteiger 6 19.09.2009 07:57
Kann LOCK TABLES zu Absturz der MySQL Datenbank führen? kat_2403 Datenbanken 2 03.09.2009 15:22
mysqlabfrage mit 2 tables (COUNT?) mqs PHP Einsteiger 6 17.06.2009 12:49
Welche Tables muss ich erstellen? She-Sign.de Datenbanken 2 12.05.2009 19:54
[Erledigt] LOCK TABLES - Thread statt Table??? Curanai Datenbanken 1 04.04.2009 01:33
[Erledigt] Problem bei delete über 2 tables fulltilt PHP Einsteiger 3 24.02.2009 22:29
Impossible WHERE noticed after reading const tables Gumfuzi Datenbanken 6 03.01.2009 10:53
Extrahieren aus 2 Tables mit einem bekannten Wert ssm Datenbanken 12 23.03.2006 20:29
Tables Schubi PHP Tipps 2005-2 0 05.08.2005 15:09
Tables Schubi PHP Tipps 2005-2 0 05.08.2005 15:08
Tables PHP Tipps 2005-2 0 05.08.2005 13:39
LOCK TABLES / LAST_INSERT_ID AliceD Datenbanken 3 20.07.2005 13:45
Suche zufalls(bild)script das in tables läuft... Beitragsarchiv 0 05.07.2005 12:18
SHOW PROCESSLIST und TEMPORARY TABLES tapferesschneiderlein Datenbanken 2 05.03.2005 11:40

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php innodb mysql_query lock, php lock tables, php mysql_query lock, lock tables, table sperren php, sql update timeout danach sperre, php mysql_query lock tables html, \lock tables\, php mysql_query lock tables read, php lock, lock table php, sobald transaktion eines anderen users beendet, mysql gleichzeitiger zugriff lock table, wann lock tables, lock tables warten, php transactions und locking, user aus transaktionen schmeißen

Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum