Oracle pessimistisches Locking

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von chris56.

    Oracle pessimistisches Locking

    Hallo,

    ich arbeite mit dem Oracle Data Provider für .NET und möchte eine Tabellenzeile zum Lesen und Schreiben sperren (pessimistisches Locking) , währen ich erst lese (select) und dann ändere (update). Aus der Tabelle lese ich die Nummer für die nächste neue Charge, die danach dann natürlich hoch gezählt werden muss. Während kein anderer darauf zugreifen sollte.

    Ich habe es mit Transaktionen versucht. Nur unterstützt der .NET Framework Data Provider für Oracle nur die Isolation Levels ReadCommitted und Serializable (msdn.microsoft.com/en-us/library/system.data.oracleclient.oracletransaction.isolationlevel(v=vs.110).aspx). Und diese Levels verhalten sich auch anders als sonst. So gehe ich davon aus, dass Serializable (was eigentlich das ist, was ich brauche) nur im DataSet sperrt, nicht aber in der Oracle Datenbank. Das haben auch meine Tests gezeigt.

    Direkt von VB.NET kann ich wohl auch keine Daten mit SELECT ... FOR UPDATE über einen Dataadapter in ein DataSet laden, oder? Ich habe es jedenfalls nicht hinbekommen ("ORA-01002: FETCH auf ungültigen oder geschlossenen Cursor.!").

    Ich könnte natürlich eine PL/SQL Prozdur mit dem SELECT und UPDATE schreiben. Ich hätte aber gerne soviel wie möglich Code in meinem .NET Programm, ohne zusätzlich Oracle Prozeduren installieren zu müssen.

    Gibt es einen anderen Weg? Hat jemand eine Idee?

    Gruß,
    Chris
    Aus der Tabelle lese ich die Nummer für die nächste neue Charge, die danach dann natürlich hoch gezählt werden muss. Während kein anderer darauf zugreifen sollte.

    Fürs Hochzählen kannst du in Oracle Sequenzen nutzen. Die liefern jedem Aufrufer auch bei gleichzeitigem Zugriff eine separate Nummer, ohne dass man sich um Sperren selber kümmern muss. Sequenz geeignet initialisieren und dann den gelieferten Sequenzwert als Chargennummer für Neueinträge nutzen.
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!

    Rainman schrieb:

    Fürs Hochzählen kannst du in Oracle Sequenzen nutzen.


    Danke für den Tipp. Kann ich aus einer Sequenz auch zum Beispiel hundert neue Nummern auf einmal abrufen?

    Nun ist die Tabelle mit den Chargennummern leider schon vorhanden. Und darauf greifen auch andere Applikationen zu. Ich kann in diesem Fall also das ganze System nicht einfach umstricken.