Sperren eines Datensatzes

ceene

Erfahrenes Mitglied
Hallo ihr lieben

Ich habe mal ne Frage zu Java und Oracle. Ich habe eine Webanwendung mit der ich in einer Datenbank Daten ändern kann. Da aber später auch mehrere Leute mit dem Programm arbeiten, muss ich einzelne Datensätze sperren wenn Sie von einem User bearbeitet werden.

Ich habe das ganze schon mit "for update nowait" im SELECT probiert aber leider scheint das nicht zu gehen.

Hat von euch eventuell wer ne Idee?
 
Ich weiß nicht, ob es Sinn macht, die Locks händisch amchen zu wollen. Im allgemeinen regelt man sowas besser über die Isolationlevels einer Transaktion.

Gruß
Ollie
 
Ich weiß nicht genau ob ich dich richtig deute, aber im Normal werden Domänenobjekte nicht explizit gesperrt, solang es keine fachliche Anforderung dafür gibt. Dann greifen die normalen Probleme von transaktionalen Datenzugriffen. D.h. bevor du eine Lösung für das Thema beschließt solltest du dich mit den Themen Transaktionen, IsolationLevel, PhantomReads usw beschäftigen. Google ist dein Freund.

Soll es aber wirklich so sein, dass man durch das Starten einer Bearbeitungsmaske ein Objekt für andere User speichert, dann musst du das zum einen in deinem DB Schema abbilden (zusätzliche Spalten für ein Lockflag, evtl. welcher User den Lock hat usw.). Desweiteren muss deine Logik natürlich diese Flags explizit setzen und sie berücksichtigen. Beim Setzen des Flags treten natürlich die oben geschildeten Problematiken wieder auf. Zusätzlich halst man sich damit natürlich auch auf zu entscheiden, ob ein anderer Benutzer diesen Lock evtl. übergehen können soll, wie ein Lock wieder sauber entfernt wird usw. Da ist man dann recht schnell bei Workflowprozessen.

Ein Datenbanklock (wie man ihn im Bereich Transaktionen, Concurrency usw. meint) greift für diesen Anwendungsfall wesentlich zu kurz bzw. ist zu technisch.

Gruß
Ollie
 
Also ich arbeite mit einem EntityManager und da scheint das mit TransactionIsolation nicht zu gehen. Denn das geht wohl nur wenn man mit einer Connection arbeitet.

Oder hab ich da was falsch verstanden?
 
Gegenfrage: was ist denn nun dein Anwendungsfall? Der erste oder der zweite?

Mit Spring geht das über die @Transactional Annotation. Für plain JPA weiß ich es nicht.

Gruß
Ollie
 
Also ich arbeite mit Seams, JBoss und Oracle. Nun soll es so sein, dass sobald ein Datensatz bearbeitet wird, er für andere User zum bearbeiten gesperrt werden soll.
Dass also kein gleichzeitige Bearbeitung möglich ist.

In meinen C-Programmen habe ich das über Oracle gemacht und sie mit for update nowait selektiert. In Java habe ich das genauso probiert aber der Datensatz ist nur solange gesperrt wie die Funktion aktiviert ist und danach nicht mehr. Nun suche ich eine andere Möglichkeit den Datensatz zu sperren.

Eigenltich müsste das doch auch ohne eine Hilfsspalte oder eine Hilfstabelle gehen, oder?
 
Also ich bin jetzt soweit das mein Datensatz von Oracle gesperrt wird.
Nachdem der Code ausgeführt wird, verlinke ich auf meine Bearbeiten-Seite wo die Feldinhalte geändert werden können. Wenn ich dann aber einen Button auf meiner Seite aktiviere, dann tut sich nichts mehr. Er geht in keine Funktion oder ähnliches. Ich bekomme auch keine Fehlermeldung.

Woran kann das liegen?

Mein Code
Code:
//Prozedur ausführen um Tabellen anzulegen
OracleDataSource ds = new OracleDataSource();	
ds.setServerName("192.168.0.12");	
ds.setPortNumber(1521);	
ds.setDatabaseName("###");	
ds.setUser("###");	
ds.setPassword("###");	
ds.setDriverType("thin");					

con = ds.getConnection();
stm = con.createStatement();
stm.executeQuery("SELECT * FROM LOV_ATTRIBUTE_CATEGORY WHERE ATCA_ID = " + selectedCategory.getAtcaId() + " for update nowait");

Sorry mein Fehler. Anstatt stm.executeQuery(...) einfach st,.execute(...) und es geht.

Ich mache das nun so das ich den Datensatz der Upgedatet werden soll mit for update nowait rausselektiere und dann einfach erst den commit absetze wenn er wieder freigegeben werden soll.
So wird die Fehlermeldung vom DBMS rausgeworfen und alles geht wieder wie gewohnt^^.

Danke für die Gedult^^
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück