# MySQL: Sperren richtig setzen und testen - wie?



## Kona (22. Februar 2010)

Hallo zusammen,

ich versuche gerade, in MySQL Transaktionen und Sperrmechanismen zu nutzen. Ich stehe nun vor folgendem Problem:

In einem Browserfenster bzw. Tab habe ich über meine kleine PHP-Anwendung einen Datensatz zum Ändern selektiert



```
SELECT * FROM fieldcat WHERE lfdnr = '1' LOCK IN SHARE MODE;
```
Damit dachte ich aus meinen bisherigen Recherchen, sei ein Datensatz bei einer InnoDB-Tabelle mit einer S-Sperre versehen, weswegen er nicht geändert werden kann. Also phpMyAdmin gestartet und denselben Datensatz angefasst:


```
UPDATE fieldcat SET readonly = '1' WHERE lfdnr = '1';
```
Ich erwartete eine Fehlermeldung von phpMyAdmin, bekam aber keine. Ein Refresh des Browsers zeigte mir dann auch, dass die Änderung durchgeführt wurde. Ich hatte hier aber erwartet, dass durch die S-Sperre genau dies nicht möglich ist.

Also habe ich es damit versucht, in dem ich eine Transaktion gestartet habe.


```
SET AUTOCOMMIT = 0;
START TRANSACTION;
SELECT * FROM fieldcat WHERE lfdnr='1' IN SHARE MODE;
```
Ich habe wieder den Datensatz mit dem UPDATE-Statement angefasst und wieder keine Fehlermeldung erhalten, obwohl ich die Transaktion nicht explizit committed hatte.

Mache ich etwas falsch oder habe ich die Funktionsweise der Sperren und Transaktionen bei InnoDB-Tabellen nicht richtig verstanden?

Ich will nochmal kurz zusammenfassen, was ich machen möchte:
Ich möchte einen Datensatz über meine Weboberfläche selektieren und bei dieser Selektion bereits die Sperre in der Datenbank setzen, sodass andere Benutzer nur noch lesend zugreifen können. Dies würde ich jedoch gern mit den in MySQL eingebauten Mechanismen erreichen.

Danke schonmal für eure Hilfe.


----------



## Thomas Darimont (26. Februar 2010)

Hallo,

laut:
http://lists.mysql.com/mysql-de/1224
http://lists.mysql.com/mysql-de/1223
http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

funktioniert das mit InnoDB nur wenn auf der Tabelle ein Primärschlüssel definiert ist und dieser
verwendet wird in der select for ... verwendet wird.

Gruß Tom


----------

