Zakładając, że jest to serwer MS SQL, prawdopodobnie chcesz UPDLOCK
, prawdopodobnie w połączeniu z ROWLOCK
(Wskazówki dotyczące tabeli
). Mam problem ze znalezieniem przyzwoitego artykułu opisującego teorię, ale oto krótki przykład:
SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1
Ta instrukcja nałoży blokadę aktualizacji w wierszu przez czas trwania transakcji (dlatego ważne jest, aby być świadomym, kiedy transakcja się zakończy). Ponieważ blokady aktualizacji są niezgodne z blokadami na wyłączność (wymagane do aktualizacji rekordów), uniemożliwi to każdemu zaktualizowanie tego rekordu do czasu zakończenia transakcji.
Należy zauważyć, że inne procesy próbujące zmodyfikować ten rekord zostaną zablokowane do czasu zakończenia transakcji, jednak po zakończeniu transakcji będą kontynuowały dowolną operację zapisu, o którą poprosiły (chyba że przekroczono limit czasu lub zostaną one zabite jako proces zakleszczony). Jeśli chcesz temu zapobiec, twoje inne procesy muszą użyć dodatkowych wskazówek, aby albo przerwać, jeśli zostanie wykryta niekompatybilna blokada, albo pominąć rekord, jeśli się zmienił.
Ponadto Nie należy używać tej metody do blokowania rekordów podczas oczekiwania na dane wejściowe użytkownika . Jeśli taki jest twój zamiar, powinieneś zamiast tego dodać do tabeli jakąś kolumnę „jesteś modyfikowany”.
Mechanizmy blokowania serwera SQL są tak naprawdę odpowiednie tylko do zachowania integralności danych / zapobiegania zakleszczeniu - transakcje powinny być generalnie tak krótkie, jak to możliwe i z pewnością nie powinien być utrzymywany podczas oczekiwania na dane wejściowe użytkownika.