php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.02.2010, 22:34  
thomas_w
Gast
 
Beiträge: n/a
Standard

PHP-Code:
$fp fopen($file'a+');                   // Datei oeffnen 
   
  
if (flock($fpLOCK_EX)) {                  // exclusive lock 
   
    
-> jetzt den Datenbank-Update

    flock
($fpLOCK_UN);                      // release lock 
  
} else { 
    echo 
"Couldn't get the lock!"
  } 
Ich geb's zu, den Teil brauchst Du natürlich gar nicht, es geht nur darum eine "exklusive" Aktion zu bekommen und die wird von flock() zusammen mit LOCK_EX garantiert.

Grüße
Thomas
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 09.02.2010, 23:43  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Browser bringt 60 Sekunden Sanduhr und schmeißt einem dann ein
"Lock wait timeout exceeded; try restarting transaction."
entgegen.
Also sorry, sowas klingt überhauot nicht nach einem sinnvollen Konzept für ein Browsergame.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 10.02.2010, 08:40  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

nikosch, Du bist mir ein bisschen zu destruktiv unterwegs...

Kein Mensch redet davon, daß alle Nase lang ein "timeout exceeded" auf dem Screen erscheint.
Mir geht's nur darum, was passiert, wenn ALLES, wirklich ALLES schief läuft...

Während dem Spiel ist für jeden Spieler nur alle 15 Minuten ein kleineres (ihn betreffend) bzw. für's ganze Spiel alle 6 Stunden mal ein größeres Update nötig.

Nur das große Update macht'n bißchen Ärger... aber auch das werd' ich wohl auf 1-5 Sekunden runterdrücken können, wie's inzwischen aussieht.

Während den 5 Sekunden, sollt's halt nicht zu Kollisionen kommen.

Mit Get_Lock lässt sich das sperren des Tabellenzugriffs für einzelne Spieler auch schick steuern.


PHP-Code:
public function update()
{

//check ob Update nötig... wenn ja...

//sql querys ausführen mit...

SELECT GET_LOCK('timetable',$lock_timeout); //erst mal ganze Tabelle sperren

//Falls Lock nicht gesetzt werden konnte... sleep (1) und update() nochmal aufrufen...

//Bestimmen: welche Tabellenteile für welche Spieler muss ich ändern?

SELECT GET_LOCK('timetable_player1',$lock_timeout); 
SELECT GET_LOCK('timetable_player3',$lock_timeout);
SELECT GET_LOCK('timetable_player7',$lock_timeout);

//falls eins der Locks nicht gesetzt werden konnte: sleep (1) und update() nochmal aufrufen...

SELECT RELEASE_LOCK('timetable'); //Tabelle für restliche Spieler wieder freigeben


// ====================
// Führe Berechnungen durch
// ====================

// Schreibe Updates als Transaction (ruiniert Tabelle nicht, falls was schief läuft)

SELECT RELEASE_LOCK('timetable_player1'); 
SELECT RELEASE_LOCK('timetable_player3');
SELECT RELEASE_LOCK('timetable_player7');



Bei anderen Schreib/Lesezugriffen müssen die Spieler dann eben checken ob
- Tabelle als ganzes und in ihrem Bereich für sie frei
- und bei Schreibzugriffen ggf. ein timetable_playerX Lock setzen.


Mit den weiteren Befehlen lässt sich das bestimmt noch bissl verfeinern...

Zitat:
mysql> SELECT GET_LOCK('lock1',10);
-> 1
mysql> SELECT IS_FREE_LOCK('lock2');
-> 1
mysql> SELECT GET_LOCK('lock2',10);
-> 1
mysql> SELECT RELEASE_LOCK('lock2');
-> 1
mysql> SELECT RELEASE_LOCK('lock1');
-> NULL


Find ich jetzt so eigentlich 'ne ziemlich cheesy Lösung.

Geändert von Samhayne (10.02.2010 um 09:01 Uhr).
Samhayne ist offline   Mit Zitat antworten
Alt 10.02.2010, 08:58  
thomas_w
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Samhayne Beitrag anzeigen
nikosch, Du bist mir ein bisschen zu destruktiv unterwegs...
Sehe ich inzwischen auch so. Da wird eine Menge aus dem Zusammenhang gerissen und dann interpretiert. Man müsste mal zählen was hier mehr Trafik erzeugt, die "blöden Fragen" oder die "Hinweise auf Google bzw. die Forenrichtlinien..."

So genug gemeckert...

@Samhayne

Schön, dass Du inzwischen eine (MySQL spezifische) Lösung gefunden hast. Wenn Du Performanceproblem auf der Datenbank bzw. mit SQL haben solltest, bitte melden...

Grüße
Thomas
  Mit Zitat antworten
Alt 10.02.2010, 20:36  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Er machts schon wieder…


Zitat:
Kein Mensch redet davon, daß alle Nase lang ein "timeout exceeded" auf dem Screen erscheint.
Das liegt wohl daran, dass kein Mensch, vor allem nicht Du, überhaupt etwas zum konkreten Anwendungsfall geschrieben hat, bis ich mal kritisch nachgefragt habe.

Zitat:
oder die "Hinweise auf Google bzw. die Forenrichtlinien..."
Leute machen Fehler, ich weise sie darauf hin. Das Problem liegt jetzt wo? Dass Dich das stört? Mich stört das auch. Genau, wie mich ständig für meine Arbeit rechtfertigen zu müssen. (Qualitätsdebatte und „nutz die Suche“)
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 17.02.2010, 13:46  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

So, wollte mich nun dranmachen, das ganze einzubauen, bzw. hab schon die ganzen Datenbankfunktionen geschrieben und merk nun ... dass get_lock einen Schönheitsfehler hat, den ich übersehen hab. -.-

Nach einem zweiten get_lock von einem User wird das erste überschrieben.

Code:
mysql> SELECT GET_LOCK('lock1',1), GET_LOCK('lock2',1), GET_LOCK('lock3',1);
+---------------------+---------------------+---------------------+
| GET_LOCK('lock1',1) | GET_LOCK('lock2',1) | GET_LOCK('lock3',1) |
+---------------------+---------------------+---------------------+
|                   1 |                   1 |                   1 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT IS_FREE_LOCK('lock1'), IS_FREE_LOCK('lock2'), IS_FREE_LOCK('lock3');
+-----------------------+-----------------------+-----------------------+
| IS_FREE_LOCK('lock1') | IS_FREE_LOCK('lock2') | IS_FREE_LOCK('lock3') |
+-----------------------+-----------------------+-----------------------+
|                     1 |                     1 |                     0 |
+-----------------------+-----------------------+-----------------------+
1 row in set (0.00 sec)
=> ausser dem zuletzt gesetzten sind alle wieder offen.

Soll wohl vor deadlocks schützen... is aber so... einfach für mich nicht zu gebrauchen.
*seufz*

Wär' auch zu schön gewesen.
Requests mehrere Locks setzen zu können gibt's einige... eingebaut wurde es aber nie.
Samhayne ist offline   Mit Zitat antworten
Alt 17.02.2010, 14:11  
thomas_w
Gast
 
Beiträge: n/a
Standard

Wellcome back...

Mit dem GET_LOCK() habe ich zwar noch nie gearbeitet, aber Dein Beispiel arbeitet ja immer mit der selben Datenbank-Connection und dem selben User. Der kann sich ja nicht selbst raussperren. Zu Testen musst Du parallel zwei MySQL-Consolen oder PHP-Skripte laufen lassen - auf den selben Datensatz - erst dann gibt es "Kollisionen".

MySQL :: MySQL 5.1 Referenzhandbuch :: 12.10.4 Verschiedene Funktionen

Grüße
Thomas
  Mit Zitat antworten
Alt 17.02.2010, 14:18  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Hey thomas.

Nene, das is klar.
Für EIN Lock geht das auch... den Ausschluss hab ich ja beim letzten mal
noch getestet und das ganze für 'ne dolle pragmatische Lösung befunden.

Aber wie de oben sehen kannst, kann jeder User nur ein einziges Lock setzen.
Setzt er ein neues mit neuem Namen wird das alte wieder freigegeben.

SELECT GET_LOCK("tabelle_1",1);
SELECT GET_LOCK("tabelle_2",1); // <= tabelle_1 ist wieder frei

Stumpffug.
Samhayne ist offline   Mit Zitat antworten
Alt 17.02.2010, 15:03  
thomas_w
Gast
 
Beiträge: n/a
Standard

..hm, was passiert bei..

Code:
// pro User mehrere Datenbank-Connection öffnen

$db1 = mysqli_connect(..);
$db2 = mysqli_connect(..);
$db3 = mysqli_connect(..);

// können vielleicht so pro User mehrere LOCKs erzeugt werden?

$db1->query('SELECT GET_LOCK("tabelle_1",1)');
$db2->query('SELECT GET_LOCK("tabelle_2",1)');
$db3->query('SELECT GET_LOCK("tabelle_3",1)');
Grüße
Thomas
  Mit Zitat antworten
Alt 17.02.2010, 16:29  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

*stirnpatsch*

Du bist ein Fuchs!
Nicht getestet, aber das sollte tun.

Nur... hm... ist das "gesund", wenn ein User 50 Datenbanklinks aufmacht? :-/
Samhayne ist offline   Mit Zitat antworten
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 Tipps 2009 2 29.10.2009 15:40
[Erledigt] breadcrumb 2 Tables mit Subcategories fulltilt PHP Tipps 2009 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 Tipps 2009 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 Tipps 2009 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
tsql lock erzeugen, lock tables, select get_lock ohne release_lock, wo wird lock table in der datenbank geändert, lock table nicht die ganze tabelle, browsergame datenbank update nur einmal ausführen php, t-sql tabelle für schreibzugriffe sperren, get_lock sperre überschrieben, get_lock auflisten, mysql get_lock wie verwenden, mysql get_lock, t-sql datenbank sperre select, mit php mysql tabelle sperren, tsql transaction ausführen mit lock und timeout, release_lock funktioniert nicht, php mysql tabelle sperren, t-sql table lock anzeigen, php \select is_free_lock\, lock wait timeout exceeded; try restarting transaction temporary tables, is_free_lock

Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 Uhr.




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