# MS SQL Server 2005 + Java: Immer nur eine aktive Verbindung erlaubt?



## DStrohma (23. Jul 2010)

Hi,

ich habe ein Programm mit dem ich auf eine MS SQL Server 2005 Datenbank zugreife. Wenn ich da aber gerade einen Datensatz editiere, dann kann kein Zweiter User auf den Datensatz zugreifen. Der zweite User muss so lange warten bis ich fertig bin und dann kann er ebenfalls auf die Daten zugreifen. Bedeutet, das Programm des Anderen hängt so lange, bis ich mit dem Editieren fertig bin.

Es liegt nicht an dieser Einstellung hier: 
	
	
	
	





```
setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
```

Da hab ich bereits alles durchprobiert, ändert nicht viel.
Könnte es vielleicht etwas damit zutun haben dass die Änderungen (wenn ich welche vornehme) direkt in die Datenbank gespeichert werden, aber wenn ich dann in der GUI auf "CANCEL" geh, ein Rollback gemacht wird??

Sieht in etwa so aus:

```
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
            conn.setAutoCommit(false);
           Savepoint start = conn.setSavepoint();
```

Fällt jemandem was dazu ein??


----------



## Gelöschtes Mitglied 5909 (23. Jul 2010)

das liegt daran, dass du falsch vorgehst.

du machst:
daten landen -> edit gui öffnen -> transaktion öffnen -> user macht 5 minuten lang irgendwas -> ok = commit / cancel = rollback

richtig:
daten laden -> edit gui öffnen -> daten sammeln 
-> ok = transaktion öffnen + statements absetzen + commit (alles in einem)
-> cancel = nix machen (bzw. ggf daten neu laden [von db oder cache/ursprünglichen objekten]

Das Verhalten der DB ist korrekt und hat nix mit der Connection zu tun


----------



## DStrohma (24. Jul 2010)

Naja, eigentlich ist es Absicht dass ich automatisch alles commite und eben nur wenn der user CANCEL drückt alles wieder rückgängig gemacht wird. Da dürfte aber - wenn ich dich richtig verstanden habe - das Problem liegen oder? Oder ist das Problem einfach dass AUTOCOMMIT auf false ist? Kann es gerade nicht ausprobieren, bin nicht in der Arbeit.


----------



## Gelöschtes Mitglied 5909 (25. Jul 2010)

> Naja, eigentlich ist es Absicht dass ich automatisch alles commite und eben nur wenn der user CANCEL drückt alles wieder rückgängig gemacht



gut dann hast du das problem halt weiterhin



> Oder ist das Problem einfach dass AUTOCOMMIT auf false ist?



Das wird das Problem nicht lösen.

Da du es anscheinend nicht verstanden hast, nochmal:

du machst:
daten landen -> edit gui öffnen -> transaktion öffnen -> user macht 5 minuten lang irgendwas *hier blockiert die DB für den zweiten Benutzer* -> ok = commit / cancel = rollback

Und nochmal zur verdeutlichung:
Wenn User 1 den Satz Editiert und sich dann einen Kaffee holt, oder in die Mittagspause geht oder was auch immer macht, dann ist der Datensatz immernoch gesperrt. Lösung siehe oben

Nochmal technisch: der Datensatz wird von begin transaction bis commit/rollback blockiert. Da du das an die GUI gekoppelt hast, können das x minuten / stunden / tage / jahre sein. Und ist schichtweg falsch.


----------



## DStrohma (27. Jul 2010)

Ok, dann nehme ich an dass es daran liegt und versuch das umzubauen... Wird aber schwierig da wir das eigentlich mit Absicht so gelöst haben ;(

Da hab ich dann aber noch eine Verständnisfrage: Was wenn die Erstellung eines Datensatzes von der vorherigen Erstellung eines anderen Datensatzes abhängt? Dann müsste ich ja den ersten Datensatz erstellen, OK klicken, wieder in die Eingabemaske gehen und dann weiter machen und den darauf aufbauenden Datensatz einfügen... Wie regle ich das dann wenn ich die Verbindung auf die herkömmliche Art und Weise löse?

Gruß,
DS


----------



## Gelöschtes Mitglied 5909 (27. Jul 2010)

> Wird aber schwierig da wir das eigentlich mit Absicht so gelöst haben



Dann habt ihr euch anscheinend nicht ausreichend Gedanken darüber gemacht.



> Was wenn die Erstellung eines Datensatzes von der vorherigen Erstellung eines anderen Datensatzes abhängt?



was soll denn passieren wenn einer nach dem 1. Satz abbrechen clickt? ist das überhaupt möglich?
Was heißt in deinem Fall abhängig? Logisch? Technisch?

Wenn die Daten voneinander abhängig sind würde ich es so deuten, dass entweder beide oder keins eingefügt werden soll.
Auch da funktioniert das so wie ich es oben beschrieben habe ohne Probleme. Daten Sammeln und auf einen Rutsch einfügen.
Geht was schief sind beide Änderungen gerollbacked.


----------

