Re: Locken einer Oracle-DB Tabelle




folgende Problemstellung habe ich in meiner Java-Anwendung, die per JDBC mit
einer Oracle 9i-Datenbank kommuniziert.



Auf eine DB-Tabelle wird von mehreren Anwendungen (die in eigenen JVM
laufen) per JDBC zugegriffen. Diese Tabelle dient zur Steuerung von
Prozessen und hat in der Spalte "Status" die Alternativen "geblockt" und
"frei".



Eine laufende Anwendung (im folgenden Prozess genannt) sucht nun in der
gesamten Tabelle in der Spalte "Status" nach dem Inhalt "geblockt". Wird
dieser gefunden, bricht die Anwendung ab. Ansonsten fährt sie fort.



warum machst Du nicht ein

select status from tabelle where prozess = 'p1' for update;

Wenn das jeder Prozess macht, warten sie solange, bis sie fortfahren dürfen. Wenn Du "...for update nowait" machst, bekommen die Prozesse eine Exception, wenn die Tabelle gesperrt ist.

Das "For Update" lockt explizit die Zeile(n), die der Where-Bedingung entsprechen. Der Lock bleibt bis zum nächsten Commit bestehen, weswegen Du vor allem "Autocommit" Deiner JDBC-verbindung abstellen musst. Ich würde auch überlegen, das ganze nicht in eine stored-procedure zu packen.

Viele Grüße
Ulrik
.



Relevant Pages

  • Index wird ungültig
    ... Ein Index auf einer Spalte einer involvierten Tabelle löste das ... Genau diese Spalte wird in einem Prozess der Anwendung intensiv bearbeitet. ... Wie kann ich das Problem lösen, ohne dass ich explizit nach diesem Update ...
    (microsoft.public.de.sqlserver)
  • =?iso-8859-1?Q?Re:_Show-Event_in_einer_form_ausl=F6sen=3F?=
    ... Wenn du PostMessage verwendet ist der Aufruf asynchron, sprich die Funktion kehrt zurück bevor das Event vom zweiten Prozess verarbeitet wurde. ... Um Strings zu übergeben könntest du eine normale FoxPro Tabelle verwenden, du hast ja erwähnt das die Ereignisse geloggt werden - in eine Tabelle vermutlich. ... Der Prozess der Ereignisse protokolliert schreibt zuerst die Daten zum Ereignis in die Log Tabelle, die Tabelle sollte idealerweise einen Primary Key vom Typ Integer besitzen, und sendet dann einfach per Send oder PostMessage an den den zweiten Prozess den Primary Key des Logeintrags, dieser kann dann einfach in der Logtabelle ein SEEK auf den PK durchführen und alle Daten des Logeintrags auslesen. ...
    (microsoft.public.de.fox)
  • Re: Umstieg Access 97 -> A2007
    ... Ein ungewollter Update ... Aber wieso mach Access "ungewollte" Updates? ... Wenn die grösste Tabelle also ... Aber ich wollte ja niemandem den Umstieg ausreden falls das so ...
    (microsoft.public.de.access)
  • Re: Triggers und History
    ... Das Komplexe beispiel ist halt der Update Trigger. ... Hier können mehrere Felder gleichzeitig geupdated werden und nur die Upgedateten sollen in die History. ... In der History Tabelle sollen alle werte entwerder ID's oder sonst Varchars sein ... ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)
  • Fehlermeldung von Access bei Verwendung von Triggern in Tabellen
    ... Tabelle dbo.sysProps besitzt einen INSERT-Trigger, der Daten der Datenzeile ... ermittlet und dieser mittels UPDATE für die eingetragende Datenzeile ... Next by Date: ...
    (microsoft.public.de.access.clientserver)