Twoje pytanie, odwołujące się do nieznanego źródła:
Przyjrzałem się blokowaniu wierszy, ale mówi, że nie możesz zapobiec wyrażeniom select, które brzmią tak, jakby nie działały tutaj dla mojego warunku. Czy mogę używać tylko doradczych blokad?
Oficjalna dokumentacja w tej sprawie:
Blokady na poziomie wiersza nie wpływają na zapytania o dane; blokują tylko pisarzy i szafki do tego samego rzędu.
Jednoczesne próby nie tylko wybiorą, ale spróbują usunąć tę samą blokadę na poziomie wiersza za pomocą SELECT ... FOR UPDATE
- co powoduje, że czekają na każdą poprzednią transakcję trzymającą blokadę w tym samym wierszu, aby zatwierdzić lub wycofać. Dokładnie to, czego chciałeś.
Jednak , wiele przypadków użycia można lepiej rozwiązać za pomocą blokad doradczych - w wersjach przed 9.5. Nadal możesz zablokować przetwarzane wiersze za pomocą FOR UPDATE
dodatkowo być bezpiecznym. Ale jeśli następna transakcja chce tylko przetworzyć „następny wolny wiersz”, często jest to dużo wydajniej nie czekać na ten sam wiersz, który prawie na pewno jest niedostępny po zwolnieniu blokady, ale natychmiast przejść do „następnego wolnego”.
W Postgresie 9.5+ rozważ FOR UPDATE SKIP LOCKED
dla tego. Jak skomentował @Craig, może to w dużej mierze zastąpić blokady doradcze.
Powiązane pytanie natykające się na tego samego wieprza wydajności:
- Funkcja, która trwa wiecznie dla dużej liczby rekordów
Wyjaśnienie i przykład kodu dla blokad doradczych lub FOR UPDATE SKIP LOCKED
w Postgresie 9.5+:
- AKTUALIZACJA Postgresa... LIMIT 1
Aby zablokować wiele wierszy naraz :
- Jak zaznaczyć określoną liczbę wierszy w tabeli przy jednoczesnym dostępie