Mam bazę danych Oracle, do której uzyskuję dostęp za pomocą Devart i Entity Framework.Równoczesne odczytywanie i aktualizowanie w tabeli bazy danych
Istnieje tabela o nazwie IMPORTJOBS
z kolumną STATUS
.
Mam również wiele procesów uruchomionych w tym samym czasie. Każdy z nich przeczytał pierwszy wiersz w IMPORTJOBS
, który ma status 'REGISTERED'
, umieścił go w stanie 'EXECUTING'
, a jeśli zostanie zrobiony, ustaw go na status 'EXECUTED'
.
teraz, ponieważ te procesy są uruchomione równolegle, wierzę następujących może się zdarzyć:
- sposób A czyta wiersz 10, który ma status
REGISTERED
, - proces B odczytuje także wiersz 10, który ma jeszcze statusu
REGISTERED
, - proces A aktualizuje wiersz 10 do statusu
EXECUTING
.
Proces B nie powinien być w stanie odczytać wiersz 10 jako sposobu A już czytać i będzie aktualizować swój status.
Jak rozwiązać ten problem? Czy chcesz przeczytać i zaktualizować transakcję? Czy powinienem użyć jakiegoś podejścia do wersjonowania lub czegoś innego?
Dzięki!
EDYCJA: dzięki przyjętej odpowiedzi Mam to działa i udokumentowałem tutaj: http://ludwigstuyck.wordpress.com/2013/02/28/concurrent-reading-and-writing-in-an-oracle-database.
dziękuję, próbuję wykonać polecenie "WYBIERZ * Z IMPORTJOBS WHERE STATUSCODE =" ZAREJESTROWANY "I ROWNUM <= 1 DLA ZAKTUALIZOWANEGO ZAKUPU ZABLOKOWANEGO", ale wciąż zwraca ten sam wiersz z różnych procesów? –
(1) upewnij się, że autocommit został wyłączony: nie można zablokować wiersza bez transakcji. (2) 'DLA ZAKTUALIZOWANEGO SKIP ZABLOKOWANEGO' i' rownum' [nie będzie działać zgodnie z oczekiwaniami] (http://stackoverflow.com/questions/5847228/oracle-select-for-update-behavour) - to dlatego, że SKIP LOCKED jest oceniany ** po ** klauzuli WHERE. Użyj opcji select bez rownum, pobierz jeden (lub więcej w razie potrzeby) wiersz i zamknij kursor, to najlepszy sposób użycia funkcji SKIP LOCKED. –
rzeczywiście, musiałem umieścić select i update w transakcji, teraz działa. Dzięki!!! –