# MySQL Mutex?



## Happyman0815 (27. Nov 2009)

Hallo Leute!

Gibt es für MySQL so etwas wie Mutexe für Tabellen?

Folgendes möchte ich realisieren:

1. Lock Tabelle_xy
2. Daten Abfragen aus Tabelle_xy
3. Daten in Tabelle_xy einfügen 
4. Unlock Tabelle_xy


Zwischen lock und unlock darf kein anderer auf die Tabelle zurgreifen (weder lesend noch schreibend). Ist das irgendwie zu realisieren?

Wenn ja, dann wären ein paar Java Codebeispiele sehr nett. Bin aber auch jedem Ratschlag dankbar der weiter hilft.


Gruß
Happyman0815


----------



## ice-breaker (27. Nov 2009)

LOCK TABLES

Eine transaktionale Engine wie InnoDB wäre aber möglicherweise (oder ziemlich sicher) eine bessere Lösung.


----------



## Happyman0815 (27. Nov 2009)

Danke für die Antwort!

Sperren LOCK TABLES die Tabellen lokal auf einem Client oder direkt auf dem Server? Wenn damit die Tabelle auf dem Server gelockt wird, so das kein Client mehr darauf zu greifen kann, dann wäre es optimal. 

InnoDB wird mir bei meinem Problem leider nicht viel weiter helfen.



EDIT:

Ich habe noch eine Frage:

Ich möchte eine eine Connection cn in mehreren Threads verwenden:


```
...main(...)
{
     
    Connection cn = null;

    try {
        ...

        cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd );
    }...
     

    for(i=0; i < 1000 ;i++ )
    {
        runThread(cn);
    }
}
```


Ein Thread sperrt nun mit LOCK TABLES eine Tabelle. Können die anderen Threads dann noch auf die Tabelle zugreifen?


----------



## ice-breaker (27. Nov 2009)

Locks gelten immer serverseitig, lockt ein Thread eine Tabelle, ist sie für alle anderen gesperrt.


----------



## Happyman0815 (27. Nov 2009)

ice-breaker hat gesagt.:


> Locks gelten immer serverseitig, lockt ein Thread eine Tabelle, ist sie für alle anderen gesperrt.



Das wäre einfach perfekt.



Folgender Block muss bei mir für die Tabelle "datei" gelockt werden.


```
st.executeQuery("SELECT MAX(DATEISCHLÜSSEL) AS DATEISCHLÜSSEL FROM datei WHERE PROJEKTSCHLÜSSEL = "+datParam_class.projektID);
						rs.next();
						int dateischlüssel = rs.getInt(1);
						dateischlüssel++;
						insertBLOB(quell, ""+dateischlüssel , 0);
```

Wie lautet hierfür denn die genaue Schachtelung, wenn ich eine Schreib und lese Sperre auf die Tabelle setzen möchte?

Also:


```
LOCK Tabelle "datei";


						
st.executeQuery("SELECT MAX(DATEISCHLÜSSEL) AS DATEISCHLÜSSEL FROM datei WHERE PROJEKTSCHLÜSSEL = "+datParam_class.projektID);
						rs.next();
						int dateischlüssel = rs.getInt(1);
						dateischlüssel++;
						insertBLOB(quell, ""+dateischlüssel , 0);




UNLOCK Tabelle "datei";
```

Evtl. weißt du das ja so aus dem stehgreif. Wenn nicht muss ich selber mal gucken aber das Problem drückt gerade ;(

Gruß
Happy


----------

