In diesem Fall müssen wir for update nowait
in Cursors verwenden.Wann sollte ich 'for update nowait' in cursors verwenden?
Antwort
Die Verwendung von for update nowait
führt dazu, dass die Zeilen belegt sind und eine Sperre eingeht, bis eine Festschreibung oder ein Rollback ausgeführt wird. Jede andere Sitzung, die versucht, eine Sperre zu erhalten, wird eine Oracle-Fehlermeldung wie ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release
erhalten.
Session1:
CURSOR abc_cur
IS
select * from dept where deptno =10 for update nowait;
Hier werden die Zeilen gesperrt sind, bis der Cursor geschlossen oder ein Commit/Rollback ausgeführt wird. Wenn inzwischen Sitzung ein anderer Benutzer von 2 die gleichen Datensätze zuzugreifen versucht, dann wird dies einen Fehler aus, wie unten dargestellt:
Session2:
select * from dept where deptno =10 for update nowait;
Dieser Benutzer kann nicht einmal die gleichen Datensätze aktualisieren oder löschen die von der ersten Sitzung gesperrt wurden.
ERROR at line 1:
`ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired`
Verbrauch: Nun, wenn Sie eine gewisse Manipulation auf bestimmte Gruppen von Datensätzen tun wollen, und Sie wollen nicht, einen anderen Benutzer aus einer anderen Sitzung Ihre Daten zu überschreiben, müssen Sie zuerst die Datensätze sperren (mit for update nowait
) und dann mach deine Manipulation. Wenn Sie mit Ihrer Manipulation fertig sind, schließen Sie den Cursor und bestätigen Sie.
EDIT in meine Session 1 Angenommen, ich das folgende Skript ausgeführt haben:
declare
cursor abc is select * from temp ;
temp abc%rowtype;
begin
open abc;
end;
jetzt in Session 2 I ausgeführt
select * from temp ;
0 rows found
Wenn ich das gleiche Skript ausführen wieder
declare
cursor abc is select * from temp ;
temp abc%rowtype;
begin
open abc;
end;
Dann bekomme ich ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release.
- 1. Wann sollte ich anstelle einer For-Schleife eine Map verwenden?
- 2. Wann sollte ich mit SQLAlchemy eine For-Schleife verwenden?
- 3. Wann sollte ich getElementById verwenden?
- 4. Wann sollte ich ConcurrentSkipListMap verwenden?
- 5. Wann sollte ich RESTful verwenden?
- 6. Wann sollte ich Threads verwenden?
- 7. In Objective-C, wann sollte ich Klassenmethoden verwenden und wann sollte ich Instanzmethoden verwenden?
- 8. In Jira Agile wann sollte ich eine "Story" verwenden und wann sollte ich eine "Verbesserung" verwenden?
- 9. Wann sollte ich Klammern in Knockout verwenden
- 10. Wann sollte ich # in ColdFusion verwenden?
- 11. Wann sollte ich Parallelität in Golang verwenden?
- 12. Wann sollte ich user.get_profile in django verwenden?
- 13. Wann sollte ich setUserState in Joomla verwenden?
- 14. Wann sollte ich vorbereitete Anweisungen genau verwenden?
- 15. Wann sollte ich before_filter vs helper_method verwenden?
- 16. Wann ich ServiceTracker vs ServiceReference verwenden sollte
- 17. Wann sollte ich AUTOLOAD von Perl verwenden?
- 18. Wann sollte ich ein ORM-Framework verwenden?
- 19. Wann sollte ich React.cloneElement vs this.props.children verwenden?
- 20. Isolationsstufe - serialisierbar. Wann sollte ich das verwenden?
- 21. Wann/warum sollte ich Groovys @CompileStatic verwenden?
- 22. Wann sollte ich __forceinline anstatt inline verwenden?
- 23. Wann sollte ich eine einheitliche Initialisierung verwenden?
- 24. Wann sollte ich Subdomains verwenden oder vermeiden?
- 25. Wann sollte ich den Git Stash verwenden?
- 26. Wann sollte ich eine Objektdatenbank verwenden?
- 27. Wann sollte ich String statt Stringstream verwenden?
- 28. Wann sollte ich @JoinColumn oder @JoinTable verwenden?
- 29. Wann sollte ich die using-Anweisung verwenden?
- 30. Wann/warum sollte ich eine Datenbank verwenden?
Also wenn ich keine warte, kann ich nicht sogar (select) die gleiche Zeile von anderer Sitzung holen, bin ich richtig? – user1
Wenn ich die gleiche Zeile aus einer anderen Sitzung abrufen, aber nicht aktualisieren möchte, wie soll ich damit umgehen? – user1
@ user1: Ja, Sie können dieselben Zeilen aus der anderen Sitzung auswählen, aber Sie können nicht dieselben Zeilen sperren, wenn diese von einer anderen Sitzung gesperrt wurden. Ja, Sie können die Zeilen aus einer anderen Sitzung abrufen. –