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
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