phpbar.de logo

Mailinglisten-Archive

AW: Lock Table

AW: Lock Table

Oliver Six mysql-de_(at)_lists.bttr.org
Fri, 14 Dec 2001 13:23:15 +0100


Lars Wolff <lars_(at)_zoom-media.de> wrote on 14.12.2001 11:39:11:

>
>> >Uff, bin selbst noch nebie im Thema... wie genau ist das zu verstehen?
>> >Wenn gleichzeitig mehrer Inserts an MySQL kommen, dann würde MySQL die
>> >auch gleichzieig schreiben? Nicht nacheinander abarbeiten?
>
>> >Und was passiert wenn ein Insert auf eine gelockte MySQL Table gemacht
>> >wird? Wartet dann Mysql bis sie wieder geunlocked ist?
>
>> die Inserts serialisiert der MySQL fuer Dich. Deshalb musst Du bei 
>> mehreren Inserts keine Angst haben, dass die Datensaetze durcheinander 
>> gewuerfelt werden. Sollte parallel zu einem Insert ein Select beim 
>> Server eintrudeln, bekommt dieser Select den neu eingefuegten Datensatz 
>> auch nicht zu sehen, bis er komplett ist.
>Das ist ja schon mal schön...
>
>
>> Das einzige Problem, wo Du ein explizites Locking selber machen musst (ob
>> nun ueber 'lock table' oder eine selbst organisierte Sperrtabelle), 
>> stellt die Bearbeitung eines Datensatzes (per Select und spaeterem 
>> Update) auf mehr als einer Client-Maschine dar.
>Sprich, mehrer leute machen einen SELECT und UPDATEN mit
>unterschiedlichen Daten?
>
>Lars
>

Hi Lars,

nur damit wir vom selben reden, ein einfaches Beispiel. Nehmen wir an, wir 
haetten folgende Tabelle: 

CREATE TABLE bla (
  id integer not null auto_increment,
  txt varchar(255),
  index(id)
)

Oeffnen jetzt Client1 und Client2 jeweils genau einen Datensatz mit "select 
* from bla where id=5", so koennen beide diesen Datensatz auf ihrer lokalen 
Maschine veraendern. Nach einer Weile schreibt jetzt Client1 seinen 
Datensatz mit "update bla set txt='neu' where id=5" wieder in die Tabelle. 
Irgendwann schreibt Client2 seinen Datensatz auch wieder   mit "update bla 
set txt='irgendwas' where id=5" in die Tabelle. Damit sind die Aenderungen, 
die Client1 vorgenommen hat, verloren, obwohl er der erste war, der den 
Datensatz angesprochen hat. In genau diesem Fall (und nur diesem!) musst Du 
selber ein Locking der Datensaetze vorsehen, da der Server nicht weiss, wer 
recht behalten soll. Sinnvollerweise sollte Client2 bereits beim Lesen des 
Datensatzes mitgeteilt bekommen, dass er den Datensatz eben nur lesen darf. 

Der Fall, dass beide Clients im selben Moment versuchen, einen Update zu 
fahren, wird - wie bei Insert und allen anderen Datenaenderungen - vom 
MySQL serialisiert. Recht behaelt dann also der, der die Mikrosekunde 
spaeter kam bzw. dessen Zeitscheibe spaeter dran ist. Die Aenderungen am 
Datensatz sehen gleichzeitig laufende Selects auch erst, wenn der Datensatz 
vollstaendig in der Tabelle steht. 

Eine Moeglichkeit, solche Lockings vorzunehmen, koennten evtl. 
Transaktionen sein; sprich man packt den Select und den Update in genau 
eine Transaktion. Das habe ich aber noch nicht ausprobiert und wuerde meine 
Hand auch nicht dafuer ins Feuer legen, dass es funktioniert. Ich fuer 
meinen Teil verwende eine getrennte Tabelle, in der alle gesperrten 
Datensaetze hinterlegt sind. Wenn jetzt Client2 seinen Datensatz liest, 
schaut er gleich noch in die Sperrtabelle, ob, wann und von wem der 
Datensatz gesperrt wurde. Damit kann der User auf Client2 sehen, wer ihn 
gerade am Aendern hindert und - wenn der Datensatz schon eine Ewigkeit 
gesperrt ist - die Sperre entfernen, da Client1 anscheinend abgeraucht ist. 

Ciao Oliver
--
Good programming is 40% experience, 30% skill, 20% RTFM, 10% caffeine, and 
5% attention to detail. 

Oliver Six, CEO
CAHOS GmbH, Cimbernstr. 51, Germany 81377 Muenchen
Phone +49 89 71 01 93 40,  Fax +49 89 71 01 93 41

---
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 



php::bar PHP Wiki   -   Listenarchive