verständnisfrage zu lock tables

verständnisfrage zu lock tables

am 10.11.2005 09:22:10 von Tom Schenk

Hi,

ich habe eine Multiuseranwendung (php) geschrieben, in welcher ein Satz=20
von sql Statements über 3 Tabellen exclusiv durchlaufen muss. D.h. da=20
darf kein anderer User während der Lösch- und Schreibmethoden dazwische=
n=20
kommen. Ich habe mit autoincrement und mysql_insert_id gearbeitet, um zu=20
verhindert, das die Primär IDs bei 'gleichzeitigem' Einfügen von Daten=
=20
verschiedener Benutzer gemischt werden.

Pseudocode:
select ID from table A where .....
delete table B where ID =3D x
delete table C where ID =3D x
insert into table B
get last_insert_id from B
insert into table C set ... last_insert_id

(Nicht wundern, es geht nicht mit updates, da eine Art Versionierung=20
läuft.)

Damit kann ich aber IMHO nicht verhindern, das nach den Löschoperationen=
=20
ein anderer Benutzer dazwischenkommt. Jedenfalls hatt ich heute einen=20
Effekt (Relationen ins Nirwana) den ich nicht anders deuten kann.

Meine Idee ist nun ein LOCK auf die tables a (read) b und c (write)=20
durchzuführen. (Transaktionen gibt die eingesetzte mysql (noch) nicht=20
her) ABER da verstehe ich die mysql Doku in einem Punkt nicht ganz. Dort=20
steht das für den Thread die Tabellen gesperrt werden. Laut Server (top)=
=20
werden permanent mehrere mysql Prozesse gestartet. Sind das forks (also=20
Threads) eines Mutterprozesses oder eigenständige Prozesse?=20
Ich habe zwischen den delete und insert eine Zwangspause eingebaut und=20
ein anderer Lesevorgang (ohne Pause) schient auch wirklich auf das=20
unlock zu warten. Nur ist es recht schwierig 15 benutzer zu simulieren.
Funktioniert mein vorgehen somit oder nicht?

Bye
tom

Re: verständnisfrage zu lock tables

am 19.12.2005 10:23:56 von Jens Puruckherr

tom schenk wrote:
> Hi,
>
> ich habe eine Multiuseranwendung (php) geschrieben, in welcher ein Satz
> von sql Statements über 3 Tabellen exclusiv durchlaufen muss. D.h. da
> darf kein anderer User während der Lösch- und Schreibmethoden dazwischen
> kommen. Ich habe mit autoincrement und mysql_insert_id gearbeitet, um zu
> verhindert, das die Primär IDs bei 'gleichzeitigem' Einfügen von Daten
> verschiedener Benutzer gemischt werden.
>
> Pseudocode:
> select ID from table A where .....
> delete table B where ID = x
> delete table C where ID = x
> insert into table B
> get last_insert_id from B

Du bekommst die last_insert_id von *deiner* session.
Es sollte also kein anderer Prozess hier reinfunken.
Damit kann man sich das Locking sparen.

Jens