11 messages in com.mysql.lists.mysql-deRe: Row Locking
FromSent OnAttachments
cps-network (Martin Fernau)13 Apr 2006 06:05 
Barry13 Apr 2006 06:19 
cps-network (Martin Fernau)13 Apr 2006 07:42 
cps-network (Martin Fernau)13 Apr 2006 08:03 
Barry13 Apr 2006 08:14 
Ingo Strüwing13 Apr 2006 08:16 
Barry13 Apr 2006 08:17 
cps-network (Martin Fernau)13 Apr 2006 08:21 
cps-network (Martin Fernau)13 Apr 2006 08:31 
Daniel Penning13 Apr 2006 08:52 
cps-network (Martin Fernau)13 Apr 2006 09:32 
Subject:Re: Row Locking
From:Daniel Penning (dpen@s0nix.de)
Date:04/13/2006 08:52:57 AM
List:com.mysql.lists.mysql-de

Hi

Hab genau das gerade mit Erfolg ausprobiert und hatte genau das gewünschte Ergebniss: Der Datensatz mit der selben ID ist gelockt, aber kein einziger anderer. Row-Locking funktioniert bei InnoDB nur auf Basis des Primärschlüssels. Dazu kommt noch die Einschränkung das nicht existente Datensätze die evtl von einem SELECT ... FOR UPDATE zurückgegeben würden auch gesperrt werden, d.h. es wird immer ein Bereich eines Indizes gesperrt. Mit einem Primärschlüssel auf die Spalte ID und der Vorraussetzung das die Datensätze vorhanden sind sollte es eigentlich keinerlei Probleme geben.

Daniel

cps-network (Martin Fernau) schrieb:

Am Donnerstag, 13. April 2006 17:15 schrieb Marcus Franke:

Nimm innodb als storage engine für deine Tabelle. Das kann locking auf row Basis. myISAM auf Tabellen..

Jain. Ich benutze InnoDB-Tabellen und hab das Problem schon etwas ausführlicher als Antwort auf "Bernhard Janetzki"'s Mail beschrieben. InnoDB mag zwar das "SELECT ... FOR UPDATE" 'beherrschen', allerdings hat dieses Vorgehen die komplette Tabelle genauso gesperrt, als würde ich sie gleich ganz sperren. Kurz:

"SELECT * FROM test WHERE id=5 FOR UPDATE" hat ein "SELECT * FROM test WHERE id=3 FOR UPDATE" eines anderen Benutzers so lange geblockt, bis es durch commit abgeschlossen wurde. Tolles Row-Locking ;-)