W takim przypadku musimy użyć for update nowait
w kursory.Kiedy należy używać "dla aktualizacji nowait" w kursory?
Odpowiedz
Użycie for update nowait
spowoduje, że wiersze będą zajęte i uzyskają blokadę, dopóki nie zostanie wykonane zatwierdzenie lub wycofanie. Każda inna sesja, która próbuje uzyskać blokadę, otrzyma komunikat o błędzie Oracle, taki jak ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release
.
Session1:
CURSOR abc_cur
IS
select * from dept where deptno =10 for update nowait;
Oto wiersze są zamknięte aż kursor jest zamknięty lub commit/rollback zostanie wykonany. Jeżeli w międzyczasie, inny użytkownik z sesji 2 próbuje uzyskać dostęp do tych samych zapisów, wówczas będzie to wygeneruje błąd, jak pokazano poniżej:
Session2:
select * from dept where deptno =10 for update nowait;
Ten użytkownik nie może nawet zaktualizować lub usunąć te same rekordy które zostały zablokowane przez pierwszą sesję.
ERROR at line 1:
`ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired`
Zastosowanie: Teraz, jeśli chcesz zrobić niektóre manipulacji na niektórych zestawów rekordów i nie chcesz innego użytkownika z innej sesji przesłonić swoje dane musisz najpierw zablokować rekordy (używając for update nowait
), a następnie wykonaj swoją manipulację. Po zakończeniu manipulacji zamknij kursor i zatwierdz.
EDIT Załóżmy w moim sesji 1 Mam wykonany następujący skrypt:
declare
cursor abc is select * from temp ;
temp abc%rowtype;
begin
open abc;
end;
teraz w sesji 2 I wykonywany
select * from temp ;
0 rows found
Gdybym ponownie wykonać ten sam skrypt
declare
cursor abc is select * from temp ;
temp abc%rowtype;
begin
open abc;
end;
Otrzymuję ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release.
- 1. Kiedy należy używać ConcurrentSkipListMap?
- 2. Kiedy należy używać _aligned_malloc()?
- 3. Kiedy należy używać JCR i kiedy należy używać JPA/RDBMS?
- 4. Kiedy należy używać WS_EX_NOREDIRECTIONBITMAP?
- 5. Kiedy należy używać AQL?
- 6. Kiedy należy używać ramek HTML?
- 7. Kiedy należy używać html5 sessionStorage?
- 8. Kiedy należy używać git skrytki?
- 9. Kiedy należy używać setUpClass i kiedy __init__?
- 10. Kiedy należy używać plików XSD?
- 11. Android: Kiedy należy używać FragmentTransaction.remove?
- 12. Kiedy należy używać uprawnienia ACCESS_COARSE_LOCATION?
- 13. Kiedy należy używać atrybutu KnownType?
- 14. Kiedy należy używać jednolitej inicjalizacji?
- 15. Kiedy należy używać sortowania Radix?
- 16. Kiedy należy używać niejawnego przesyłania?
- 17. Kiedy należy używać struktury MVC w JavaScript?
- 18. W Objective-C, kiedy należy używać metod klas i kiedy należy używać metod instancji?
- 19. Kiedy należy używać nawiasów w nokautach
- 20. Kiedy należy używać user.get_profile w django?
- 21. Kiedy należy używać SnapsToDevicePixels w WPF 4.0?
- 22. Kiedy należy używać "prototypu" w JavaScript
- 23. Kiedy należy używać setUserState w Joomla?
- 24. Kiedy należy używać ViewData zamiast ViewModels?
- 25. Kiedy należy używać klasyfikatora PyPI "Naturalny język"?
- 26. Kiedy należy używać HStoreField zamiast JSONField?
- 27. Kiedy należy używać express.js na samodzielny node.js
- 28. Kiedy należy używać funkcji document.ready jQuery?
- 29. Kiedy należy korzystać i kiedy należy importować w Aurelia?
- 30. Kiedy/nie należy używać adaptera synchronizacji
Więc jeśli nie używam czekania, nie mogę nawet pobrać (SELECT) tego samego wiersza z innej sesji, czy mam rację? – user1
Jeśli chcę pobrać, ale nie zaktualizować tego samego wiersza z innej sesji, w jaki sposób powinienem obsłużyć? – user1
@ użytkownik1: tak, możesz wybrać te same wiersze z drugiej sesji, ale nie możesz zablokować tych samych wierszy, jeśli zostało to zablokowane przez inną sesję. Możesz pobrać wiersze z innej sesji. –