Czasami pojawia się komunikat „Nie można kontynuować skanowania z NOLOCK
powodu przenoszenia danych” w przypadku niektórych dużych zadań, które WITH (NOLOCK)
dotyczą wybranych zapytań.
Rozumiem, że ma to coś wspólnego z próbą wybrania danych, gdy nastąpił podział strony, który spowodował, że dane nie były już tam, gdzie powinny być - Zakładam, że tak właśnie dzieje się w moim środowisku.
Jak mam to odtworzyć?
Próbuję zrobić krótkoterminowe obejście, aby złapać błąd i spróbować ponownie, gdy to się stanie, ale nie mogę go przetestować, jeśli nie mogę go odtworzyć. Czy istnieje rozsądnie niezawodny sposób na spowodowanie tego?
Kiedy tak się stanie, ponowne wykonanie zapytania zakończy się sukcesem - więc tak naprawdę nie mam obaw o trwałe uszkodzenie danych lub bazy danych. Niektóre tabele w zapytaniu (wraz z ich indeksami) są często usuwane, ponownie tworzone i ponownie wypełniane, więc zakładam, że jest to z tym związane.
Usunięcie NOLOCK
jest moim długoterminowym problemem do rozwiązania. Powodem tego NOLOCK
było przede wszystkim to, że zapytania były tak złe, że blokowały się w codziennych transakcjach, podobnie NOLOCK
jak pomoc dla zespołu, aby zatrzymać impas (który zadziałał). Potrzebuję więc opaski na opasce, dopóki nie możemy zrobić trwałego rozwiązania.
Gdybym mógł to odtworzyć w Hello World, planowałbym prawdopodobnie nakleić pomoc zespołu na pracę w niecałą godzinę. Nie można usunąć wyszukiwania i zastąpienia NOLOCK
, ponieważ zacznę ponownie dostawać się impasów aplikacji, które są dla mnie gorsze niż okazjonalne nieudane zadanie.
Dobrym rozwiązaniem jest użycie izolacji odczytu zatwierdzonych migawek - będę musiał współpracować z naszym zespołem bazy danych, aby uzyskać więcej informacji na ten temat. Częścią naszego problemu jest to, że nie mamy eksperta od SQL Servera, który poradziłby sobie z tego rodzaju sprawami i nie rozumiem poziomów izolacji wystarczająco dobrze, aby dokonać tej zmiany teraz.
DEADLOCK_PRIORITY
, aby LOW
w pracy, tak, że jeśli istnieje zakleszczenia, zadania zakończy się niepowodzeniem, a nie aplikacji. Następnie możesz zbadać impasy i dowiedzieć się, dlaczego tak się dzieje, i rozwiązać ten problem. Może to być bardzo prosta poprawka, na przykład zamiana kolejności dwóch instrukcji. Jakikolwiek jest problem, nieNOLOCK
jest to rozwiązanie , więc przestań próbować wymuszać, aby było tak tylko dlatego, że jest to najłatwiejsze.
NOLOCK
z tych miejsc pracy? 601 powinno być najmniejszym z twoich zmartwień, jeśli wyniki tych zapytań mają być dokładne . Paul White pokazuje szczególnie okropny przykład odczytu danych, który nie powinien być tutaj możliwy .