| SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden. |
 |

01-12-2003, 23:16
|
|
sEeb
Registrierter Benutzer
|
|
Registriert seit: Aug 2003
Beiträge: 135
|
|
MySQL - Synchronisation
folgendes: ich habe einen datensatz von user1
user1 kann diesen nun abrufen und ändern
genauso könnte aber user2 diese daten (teilweise) abrufen und ändern
wie verhindere ich nun das zb user2 einen teil der daten ändert, dann user1 die daten lädt und dann user2 den rest der daten ändert, so dass user1 teilweise veraltete daten erhalten hätte
ich hab eine funktion, um ne datensatz abzurufen und eine um den datensatz upzudaten
wenn php immer ne ganze funtkion durchläuft bevor es was anderes macht müsste das problem ja gelöst sein (hoffe ich), was aber wenn php im time sharing modus arbeitet (ka wie php den code mehrerer user abarbeitet) und jetzt einen teil für user1 abarbeitet dann nen teil für user2 und dann den rest für user1 ?
hoffe ihr versteht mein problem
|

01-12-2003, 23:22
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.621
|
|
beim updaten ein LOCK TABLES machen.
Geändert von Abraxax (01-12-2003 um 23:26 Uhr)
|

02-12-2003, 08:36
|
|
sEeb
Registrierter Benutzer
|
|
Registriert seit: Aug 2003
Beiträge: 135
|
|
naja im prinzip net schlecht aber vielleicht nicht so ganz das was ich brauche, weil damit sperre ich ja ne ganze tabelle, mir reicht es wenn ich nur eine zeile (also alle daten einen benutzers) WHERE ID=$user_id sperre
ausserdem weiss ich (hab mir deinen link durchgelesen) net, was ich mache wenn die tabelle nun LOCKED ist und nen anderer prozess versucht drauf zuzugreifen, gibt das ne bestimmte fehlermeldung die man abfangen kann, so dass ich ne schleife um die abfrage bauen kann die solange läuft bis die tabelle nicht mehr gesperrt ist oder ein zeitlimit erreicht wurde ?
|

02-12-2003, 08:37
|
goth
 Moderator
|
|
Registriert seit: Mar 2002
Ort: Erde
Beiträge: 7.242
|
|
Dann mußt Du Dir halt 'nen InnoDB Handler installieren ... und den Datensatz mit einem
Code:
SELECT ... FOR UPDATE
sperren ...
__________________
carpe noctem
Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht!
Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung!
http://www.mysqldiff.org
|

02-12-2003, 16:19
|
|
sEeb
Registrierter Benutzer
|
|
Registriert seit: Aug 2003
Beiträge: 135
|
|
müsste dann auf dem server meiner page installiert sein, da hab ich wohl keinen einfluss drauf ...
|

02-12-2003, 16:22
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.621
|
|
und was machst du jetzt?
|

02-12-2003, 17:39
|
|
sEeb
Registrierter Benutzer
|
|
Registriert seit: Aug 2003
Beiträge: 135
|
|
- gelöscht aktuelles siehe unten
Geändert von sEeb (02-12-2003 um 22:18 Uhr)
|

02-12-2003, 18:06
|
|
sEeb
Registrierter Benutzer
|
|
Registriert seit: Aug 2003
Beiträge: 135
|
|
- nochmal gelöscht aktuelles siehe unten
Geändert von sEeb (02-12-2003 um 22:18 Uhr)
|

02-12-2003, 19:32
|
|
sEeb
Registrierter Benutzer
|
|
Registriert seit: Aug 2003
Beiträge: 135
|
|
alle guten dinge sind drei
hier die fertigen funktionen
sry das ich jetzt so oft hintereinander gepostet hab, aber jetzt habt ihr zwei funktionen die was bringen
wie gesagt wenn ihr mir zustimmt das sie gut sind, poste ich sie im codeschnipsel bereich
PHP-Code:
// grundgerüst zum ändern von daten aus einer DB
// beim starten der funtkion wird die entsprechende zeile (der datensatz) des users gesperrt
// beim verlassen könnenn andere wieder drauf zugreifen
//
// DB-Werte
//
// changing werte:
// 0 wird nicht bearbeitet, datensatz kann abgerufen, verwendet werden
// 1 wird gerade bearbeitet
//
// changed werte:
// 0 datensatz wurde nicht geändert
// 1 datensatz wurde geändert
//
// parameter
// $id id des datensatzes
// $table name der zu ändernden tabelle als string "name"
// $request spalten die geändert werden sollen, als string durch kommas getrennt ( "spalte1, spalte2, spalte3")
//
function getDB($id, $table, $request) {
global $db_name, $db_login, $db_pass, $einstellung;
$ret_val = "";
// anzahl bisheriger mitspieler herausfinden
$link = mysql_connect( $db_name, $db_login, $db_pass)
or die ("Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden");
$select_db = mysql_select_db ( "finalwar", $link )
or die ("Die Datenbank wurde nicht gefunden. Wenden sie sich an den Admin");
// ändern anmelden beim eintritt in funktion
// wenn bereits geändert wird, warten bis der datensatz wieder verfügbar ist
// maximal 10 sekunden warten, dann abrechen und von einem Fehler ausgehen
$start = time();
do {
if (time() - $start > 10)
die ("Zeitüberschreitung der Anfrage. Bitte später nocheinmal versuchen. Sollte dieser Fehler öfters auftreten, bei einem Admin melden");
// ändern anmelden, wenn möglich
$query = "UPDATE $table SET changing=1 WHERE ID='$id' AND changing=0 LIMIT 1";
$result = mysql_query($query, $link)
or die ("Datenabruf kann nicht initialisiert werden: ".mysql_error());
}while( !mysql_affected_rows($link) );
// wurden die daten geändert?
$query = "SELECT changed FROM $table WHERE ID='$id' LIMIT 1";
$result = mysql_query($query, $link)
or die ("Datenabruf kann nicht initialisiert werden: ".mysql_error());
$object = mysql_fetch_object($result);
if ($object->changed) {
$query = "SELECT ".$request." FROM $table WHERE ID='$id' LIMIT 1";
$result = mysql_query($query, $link)
or die ("Datenabruf kann nicht ausgeführt werden: ".mysql_error());
$ret_val = mysql_fetch_object($result);
}
// fertig, datensatz freigeben
$query = "UPDATE $table SET changing=0, changed=0 WHERE ID=$id LIMIT 1";
$result = mysql_query($query, $link)
or die ("Fehler beim Verlassen einer DB-Funtkion, unbedingt einem Admin melden: ".mysql_error());
mysql_close($link);
return $ret_val;
}
// grundgerüst zum abrufen von daten aus einer DB
// beim starten der funtkion wird die entsprechende zeile (der datensatz) des users gesperrt
// beim verlassen könnenn andere wieder drauf zugreifen
//
// DB-Werte
//
// changing werte:
// 0 wird nicht bearbeitet, datensatz kann abgerufen, verwendet werden
// 1 wird gerade bearbeitet
//
// changed werte:
// 0 datensatz wurde nicht geändert
// 1 datensatz wurde geändert
// parameter
// $id id des datensatzes
// $table name der zu ändernden tabelle als string "name"
// $changes spalten die geändert werden sollen, als string "spalte1=neue daten, spalte2=neue daten, spalte3=neue daten";
function setDB($id, $table, $changes) {
global $db_name, $db_login, $db_pass, $einstellung;
// anzahl bisheriger mitspieler herausfinden
$link = mysql_connect( $db_name, $db_login, $db_pass)
or die ("Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden");
$select_db = mysql_select_db ( "finalwar", $link )
or die ("Die Datenbank wurde nicht gefunden. Wenden sie sich an den Admin");
// ändern anmelden beim eintritt in funktion
// wenn bereits geändert wird, warten bis der datensatz wieder verfügbar ist
// maximal 10 sekunden warten, dann abrechen und von einem Fehler ausgehen
$start = time();
do {
if (time() - $start > 10)
die ("Zeitüberschreitung der Anfrage. Bitte später nocheinmal versuchen. Sollte dieser Fehler öfters auftreten, bei einem Admin melden");
// ändern anmelden, wenn möglich
$query = "UPDATE $table SET changing=1 WHERE ID='$id' AND changing=0 LIMIT 1";
$result = mysql_query($query, $link)
or die ("Datenänderung kann nicht initialisiert werden: ".mysql_error());
}while( !mysql_affected_rows($link) );
// daten ändern
$query = "UPDATE $table SET ".$changes." WHERE ID='$id' LIMIT 1";
$result = mysql_query($query, $link)
or die ("Datenänderung kann nicht ausgeführt werden: ".mysql_error());
// fertig, datensatz freigeben
$query = "UPDATE $table SET changing=0, changed=1 WHERE ID=$id LIMIT 1";
$result = mysql_query($query, $link)
or die ("Fehler beim Verlassen einer DB-Funtkion, unbedingt einem Admin melden: ".mysql_error());
mysql_close($link);
}
Geändert von sEeb (02-12-2003 um 22:19 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|