# Bestimmte Änderung in der Db rückgängig machen



## Spontex (3. Mrz 2005)

Hallo,

ich schreibe gerade an einem DB Frontend - und habe jetzt ein Problem mit dem einbauen einer "Undo Funktion". Es könnten mehrere Formulare zur Datenpflege gleichzeitig geöffnet sein wobei alle natürlich die selbe DB Verbindung benutzten. Nehmen wir folgenden Fall an:

Formular 1: führt insert aus

Formular 2: führt update aus

Formular 1: führt upade aus

Nun will der User seine Änderungen im Formular 2 rückgängig machen und drückt auf undo, ich führe dann ein rollback() aus. Jetzt wird aber das letzte update aus Formular 1 rückgängig gemacht, da rollback() ja immer die letzte Änderung rückgängig macht.
Eine Möglichkeit wäre natürlich das setzten von Savepoints, aber dann würden im Beispiel die Änderungen von Formular 1 und 2 rückgängig gemacht.

Wie kann ich also JDBC anweisen eine bestimmte Änderung rückgängig zu machen und nicht einfach die letzte? Ich arbeite hier mit JDBC 3 falls es weiterhilft. Oder muss ich es ganz anders - sprich selber machen? 

Freundliche Grüsse
Spontex


----------



## Student (3. Mrz 2005)

Juhu,
mir stellt sich zuerst mal eine ganz andere Frage ..

Warum erlaubst Du überhaupt, dass zwei Formulare ( => zwei User ) gleichzeitig an einem Datensatz rumfummeln?

Also ich meine .. eventuell kann man ja dort schon ansetzen und das auftretenden Problem damit clever umgehen.

Grüße Ben ...


----------



## thE_29 (3. Mrz 2005)

Glaub das ist so weil er nach jedem Befehl oder nach jedem schließen ein COMMIT macht (würd ich mal schätzen)

Probier mal immer das gleiche Statement zu nehmen! Und erst dann wenn er speichert schreibst ihm noch ein Commit raus!


----------



## Spontex (3. Mrz 2005)

Student hat gesagt.:
			
		

> Juhu,
> mir stellt sich zuerst mal eine ganz andere Frage ..
> 
> Warum erlaubst Du überhaupt, dass zwei Formulare ( => zwei User ) gleichzeitig an einem Datensatz rumfummeln?
> ...



Ich erlaube es da es eine MDI Anwendung ist und ich es halt praktisch fände, wobei zwei Formulare dann ein und demselben User entsprechen. Natürlich könnte ich es dahingehend ändern das immer nur ein Formular zur Datenpflege geöffnet sein darf. Und die Anzahl an Änderungen entspricht dann der Anzahl an "Undo´s" die gemacht werden düfen... immer einfach einen rollback() und fertig!
Aber das kann ja jeder    es ist keine zwingende Vorraussetzung für das Programm das mehrere Formulare gleichzeitig geöffnet sein können, aber ich würde es wie gesagt gerne machen.




			
				thE_29 hat gesagt.:
			
		

> Glaub das ist so weil er nach jedem Befehl oder nach jedem schließen ein COMMIT macht (würd ich mal schätzen)
> 
> Probier mal immer das gleiche Statement zu nehmen! Und erst dann wenn er speichert schreibst ihm noch ein Commit raus!



Ja, solange AutoCommit auf true steht ist es so - und Standardmässig steht es auf true.


Grüsse Spontex


----------



## Bleiglanz (3. Mrz 2005)

Haben die beiden Formulare die gleiche Connection? Dann gibt es nur eine einzige transaktion - und auch die savepoints sind gemeinsam!?! Die von dir gewünschte Funktionalität kannst du mit einer einzigen Connection nicht erreichen

Schau dir mal die Batchfunktionalität an, du kannst alle Befehle eines users sammeln... und per "Speichern" Button in einem Rutsch ausführen

Selbst wenn du das hinkriegst, ist es trotzdem ziemlich übel (Form1 speichert wert 10, Form2 speichert wert 20, dann ist der Wert von Form1 weg) -> "offline concurrency" Problem musst du von hand lösen...


----------



## Spontex (3. Mrz 2005)

Bleiglanz hat gesagt.:
			
		

> Haben die beiden Formulare die gleiche Connection? Dann gibt es nur eine einzige transaktion - und auch die savepoints sind gemeinsam!?! Die von dir gewünschte Funktionalität kannst du mit einer einzigen Connection nicht erreichen


Ja alle Formulare verwenden die selbe Connection.



			
				Bleiglanz hat gesagt.:
			
		

> Schau dir mal die Batchfunktionalität an, du kannst alle Befehle eines users sammeln... und per "Speichern" Button in einem Rutsch ausführen
> 
> Selbst wenn du das hinkriegst, ist es trotzdem ziemlich übel (Form1 speichert wert 10, Form2 speichert wert 20, dann ist der Wert von Form1 weg) -> "offline concurrency" Problem musst du von hand lösen...



Also bleiben mir wohl nur zwei Möglichkeiten das ganze mit einem vertretbaren Aufwand zu erledigen:

- Es darf einfach immer nur ein Formular gleichzeitig geöffnet sein
- Jedes Formular bekommt eine eigene Connection

Wie sehr würde letzteres die DB belastet? Oder ist sowas sowieso vom "state of the art" her tabu?


----------



## Bleiglanz (3. Mrz 2005)

Nimm einen Connectionpool

Verwende Locks, damit nicht in beiden Formularen der gleiche Record angezeigt wird (die daraus entstehende Verwirrung ist ziemlich schräg)


----------

