| | | | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Erfahrener Benutzer Registriert seit: 26.07.2006
Beiträge: 121
![]() | Hallo, langsam frage ich mich, ob Du hier nicht eher ein Konzeptproblem hast. Nach Deinen Schilderungen bislang habe ich hier scheinbar ein zweistufiges Problem. 1. Du möchtest z.Tl. umfangreiche Änderungen durchführen, die viel Zeit erfordern und erst nach Abschluss sichtbar sein dürfen. Unklar ist, erfolgen sie zyklisch automatisiert (was durchaus bei den angegebenen Zeiten sinnvoll wäre) oder interaktiv. 2. Du brauchst für die Anzeige immer eine valide Datenbasis die notfalls mit einer Anzeige versehen werden kann "wird gerade aktualisiert". Mein Grundsatzvorschlag wäre dann, die Daten zur Neuberechnung neu in die Datenbank einzustellen und Alt- und Neu-datensätze durch eine ID oder einen Timestamp zu unterscheiden. Bis zur fertigstellung kann dann bei der Anzeige die altdaten gezogen werden, während für die neuen Daten sogar ein rollback möglich wäre. Die Existenz der Neudaten kann gleichzeitig als Indikator genommen werden, dass aktuell eine aktualisierung erfolgt. Jetzt musst Du nur noch das Problem parallel zu bearbeitender Prozesse lösen. Hier kann eine vereinfachte semaphorenlösung genommen werden oder es werden die Änderungsdaten in einer separaten tabelle gesammelt und per batch/cron prozess dann aktualisiert. das ganze kann natürlich noch optimiert werden. Gruß Jumper, the II. |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 26.07.2006
Beiträge: 121
![]() | Zitat:
Gruß, Jumper, the II. | |
| | |
| | |
| Gast
Beiträge: n/a
| Um alles zu testen, brauchst Du eine mysql-console und ein php-skript. Damit simulierst Du die beiden parallelen konkurierenden Benutzer. Der Trick ist der SELECT .. FOR UPDATE. Damit reservierst Du Dir einen exklusiven Zugriff auf die Daten. Code: mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) mysql> mysql>SET AUTOCOMMIT = 0; mysql>SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; mysql>SELECT * FROM tabelle FOR UPDATE; -> jetzt ist die Tabelle gesperrt mysql>UPDATE tabelle SET wert = 1; mysql>COMMIT; -> jetzt ist die Tabelle wieder frei PHP-Code: Grüße Thomas |
|
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Ich finde die Diskussion geht viel zu weit in die Richtung Locking, obwohl das gar nicht nötig zu sein scheint (ausser dass der TE das irgendwo gelesen und deshalb hier geschrieben hat). Spricht irgendwas gegen meinen Vorschlag aus #19 (LOCK tables...)?
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 26.07.2006
Beiträge: 121
![]() | solange nicht geklärt ist, was und wie etwas zu welchen zeitpunkten gesperrt, mit altenn daten oder zeitaktuell abgefragt werden kann, darf und muss, kann keine optimale lösung diskutiert werden. Ich persönlich sehe bei den bislang beschriebenen Anforderungen eigentlich eher den Bedarf an einer sinnvollen Analyse, bei der die Verarbeitungsstrategie geprüft und ggf. revidiert werden sollte. Locks uns semaphoren können sinnvoll sein, sind aber als potentielle störer der verarbeitung in ihren Einsatz auf das absolut notwendige Minimum zu reduzieren. An dieser Stelle ist aber der Anfragende gefragt und nicht wir Gruß, Jumper, the II. |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse: Fortgeschritten ![]() | Es ist schon interessant wieviele Posts man machen kann trotz das die Lösung schon im Titel steht! Ein write lock macht genau das was gefordert ist, sobald ein Thread ein write lock hat kann kein anderer Thread mehr die Tabelle lesen noch schreiben. Alternativ bringt Mysql auch get_lock() als pseudo lock mit (was hier versucht wird nach zu bauen). Hat den Vorteil man kann selbst entscheiden wer diesen Lock berücksichtigen soll. Würde aber ein write lock vorziehen wenn ich nur schnell ein paar Datensätze einfügen will, ist performance technisch von Vorteil. |
| | |
| | ||||
| Neuer Benutzer Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse: Fortgeschritten ![]() | Zitat:
Durch das SELECT ... FOR UPDATE werden die Reihen also gesperrt! Hab's getestet. Browser bringt 60 Sekunden Sanduhr und schmeißt einem dann ein "Lock wait timeout exceeded; try restarting transaction." entgegen. Ausser zwischendurch kommt das COMMIT oder ich beende mysql.exe mit exit;. Dann ist die Sanduhr sofort weg und die Seite lädt. Das wär ja eigentlich genau das, was ich suche. Is nur die Frage, was passiert, wenn was unerwartetes passiert und noch ein Lock gesetzt ist. Hm. Ich schätz' mal, nach dem inactivity connection timeout des clients würde auch das lock aufgehoben? Der Standardwert liegt bei 60 Sekunden, kann das sein? Wär' ja nicht schlimm, wenn im Worst Case das Ding mal 60 Sekunden ausfällt... Die Anweisungen kann ich auch in php mysql(i)_query()s packen und es funktioniert noch? Zitat:
Grundidee ist klar... Lock über ein File auf der Platte. Aber was wird da erhöht und gezählt... und warum wird es erhöht? Zitat:
Wenn 4 Tage nix passiert, passiert auch nix. Der erste Spieler, der sich einlogged stösst dann ein Update für alle Spieler an, mit denen er was zu tun. Ich bastel nicht erst seit gestern daran, drum wirst zu sicher mein Sträuben verstehen, nochmal all zu viel dran umzumodeln. Bei der Aktualisierung die Dateien neu zu schreiben hab ich bewusst vermieden um die Einträge der Spieler nicht quer über die Datenbank zu verteilen. (Klar kann man's durch einen passenden Select wieder ordnen, wenn man reinguckt, aber... mir gefiel's besser, daß IDmässig Spieler kompakt auf Spieler folgt) Mein letztes Problem ist eben das Locking der Tabelle, so daß die User sich nicht in die Quere kommen, wenn sie darauf schreiben. Geändert von Samhayne (09.02.2010 um 22:02 Uhr). | |||
| | |
| | ||
| Neuer Benutzer Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse: Fortgeschritten ![]() | Zitat:
Dachte, sowas sei derart täglich Brot, daß es 'ne schnöde Standardantwort geben müsste. Aber schon beim Durchblättern der Bücher wurd's da irgendwie... recht konfus. get_lock() hab ich mir heut morgen sogar angeglotzt... aber nicht gleich kapiert und mir eingebildet, daß ich eh was anderes such... Auch sehr schick eigentlich... PHP-Code: Code: db1 user trying to lock... result: 1 [10 Sekunden Pause] db2 user trying to lock... result: 0 Ein Parameter für das Timeout des Locks wär schicker gewesen als ein Parameter wann der User 'nen Timeout kriegt. Aber auch hier wird hoffentlich dasselbe gelten und das Lock auf jeden Fall nach 60 Sekunden gelöst werden. edit: Hmm... naja... mal auf 70 Sekunden hochgestellt, den lock timeout, und zwischen den ersten und den zweiten Query ein sleep(30) gebastelt: Code: Warning: mysqli_query() [function.mysqli-query]: MySQL server has gone away in C:\_web\myserver.dev\public_html\... on line 212 Warning: mysqli_query() [function.mysqli-query]: Error reading result set's header in C:\_web\myserver.dev\public_html\... on line 212 Fatal error: Maximum execution time of 60 seconds exceeded in C:\_web\myserver.dev\public_html\...\_locktest.php on line 212 Geändert von Samhayne (09.02.2010 um 22:51 Uhr). | |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ä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 |
| mysql get_lock lock tables, mysql nach update daten gesperrt, php flock timeout, mysql get_lock, php locking, tabellen lock mysql grund ermitteln, php script trotz fehler weiter ausführen, db2 row nach select sperren, tutow postleitzeit, select for update db2, mysql table_lock_wait, mysql lock wait timeout exceeded, lock wait timeout exceeded try restarting transaction, vielleicht gibt es noch eine abgelaufene lock-datei, php db2 exclusive lock, mysqli lock table write, vielleicht gibt es noch eine abgelaufene lock-datei?, table lock php get_lock(), select \for update\ db2, commit zwischendurch bei umfangreichen update |