# MySQL 5 - Datensatz sperren



## ceene (15. Januar 2010)

Hallo ihr lieben

Arbeite jetzt seid ein paar Tagen mit MySQL und komme auch recht gut damit klar. Allerdings
komme ich gerade nicht wirklich weiter. Wie kann ich denn selektierte Datensätze sperren?
Also ich Oracle mach ich das mit Select for update aber das scheint in mysql nicht so ganz zu en,
oder mach ich was falsch?

Select * from daten where id = xx for update;

Im Netzt sagen viele man kann garkeine Daten sperren nur Tables aber das kann ich mir nicht vorstellen.

Also wie kann ich einen Datensatz für andere Sessions sperren?


----------



## dbwizard (15. Januar 2010)

ceene hat gesagt.:


> Also wie kann ich einen Datensatz für andere Sessions sperren?



Hallo,

Müsste so gehen :

http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html

DIe Version deiner Instanz wäre noch hilfreich, aber ich glaube, diese Funktionalität gibts schon eine ganze Weile.


Gruss


----------



## ceene (15. Januar 2010)

also auf der seite wird for update beschrieben, aber es klappt nicht damit. Ich mache meinen Toad zweimal auf und selektieren einen datensatz mit for update und kann trotzdem im anderen Toad den gleichen Satz mit for update selektieren......das darf doch eigentlich nicht gehen oder?


----------



## dbwizard (15. Januar 2010)

ceene hat gesagt.:


> also auf der seite wird for update beschrieben, aber es klappt nicht damit. Ich mache meinen Toad zweimal auf und selektieren einen datensatz mit for update und kann trotzdem im anderen Toad den gleichen Satz mit for update selektieren......das darf doch eigentlich nicht gehen oder?



Doch, das "darf" gehen, wenn du eine LOCK IN SHARE Mode setzt :


```
SELECT ... LOCK IN SHARE MODE sets a shared mode lock on the rows read. A shared mode lock enables other sessions to read the rows but not to modify them. The rows read are the latest available, so if they belong to another transaction that has not yet committed, the read blocks until that transaction ends.
```

- Du wirst den Datensatz in der 2. Session nicht updaten können

Gruss


----------



## ceene (15. Januar 2010)

Ah, sry stand etwas aufm Schlauch 

Also mit dem Shared Mode kann ich nichts anfangen, da der User den Datensatz selektieren darf, aber das darf er nicht können.

So hab ich dann Select......for update versucht, leider musste ich festestellen, dass er mehere Datensätze sperrt, obwohl ich nur einen selektieren, woran liegt das?
Muss ich da noch was einstellen oder wo liegt mein Fehler?


----------



## dbwizard (15. Januar 2010)

ceene hat gesagt.:


> Ah, sry stand etwas aufm Schlauch
> 
> Also mit dem Shared Mode kann ich nichts anfangen, da der User den Datensatz selektieren darf, aber das darf er nicht können.
> 
> ...


Hallo

Das hängt von deine Selektionskriterien ab. Wie sieht deine Einschränkung aus ?


Gruss


----------



## bofh1337 (15. Januar 2010)

Sollte doch mit "LOCK TABLE <tabelle>" gehen, oder irre ich mich?


----------



## ceene (15. Januar 2010)

In der Unten genutzen Tabelle befinden sich 5 Sätze.

```
select * from prf_mandant where prf_md_mandant = 'Batchtest' for update;
```
(prfm_md_mandant ist aber auch kein Primärschlüssel)

So sperrt er alle Sätze in der Tabelle, obwohl sich die Namen in dem Feld überall unterscheiden.


Mir ist aber aufgefallen, wenn man über den Primärschlüssel selektiert, dass es dann funktioniert.
Warum geht das über ein Nicht Primärschlüssel-Feld nicht?


----------



## dbwizard (15. Januar 2010)

bofh1337 hat gesagt.:


> Sollte doch mit "LOCK TABLE <tabelle>" gehen, oder irre ich mich?



Ja, sicher, aber das wäre eher "unkonventionell"....Die übrigen Benutzer deines System hätten sicher viel Spas daran 

Gruss


----------



## dbwizard (15. Januar 2010)

ceene hat gesagt.:


> Mir ist aber aufgefallen, wenn man über den Primärschlüssel selektiert, dass es dann funktioniert.
> Warum geht das über ein Nicht Primärschlüssel-Feld nicht?




Hmm...da hört mein Wissen über MySQL auf...(Ich bin eingentlich ein Oracle-Mensch ). Du wirst die Doku durcharbeiten müssen


Gruss


----------



## ceene (15. Januar 2010)

Noch eine kleine Frage zum Abschluss. Gibt es eine Möglich das autocommit für die komplette Datenbank auszuschalten?


----------



## dbwizard (15. Januar 2010)

ceene hat gesagt.:


> Noch eine kleine Frage zum Abschluss. Gibt es eine Möglich das autocommit für die komplette Datenbank auszuschalten?



Ja


SET AUTOCOMMIT = 0 

http://dev.mysql.com/doc/refman/5.1/de/innodb-and-autocommit.html

Gruss


----------

