Wymuszanie limitu czasu zapytania w programie SQL Server

79

Mieliśmy problem z blokiem kodu, który słabo reaguje w obliczu powolnych baz danych (niszczy łóżko po przekroczeniu limitu czasu zapytania). Stworzyliśmy łatkę i jesteśmy w trakcie przeprowadzania jej przez regresję.

Nie możemy dostać limitu czasu. Otworzyłem transakcję z SQL Mgmt Studio i zaktualizowałem każdy wiersz, aby je zablokować, ale to nie powoduje przekroczenia limitu czasu INSERTs (czego potrzebuję).

Czy mogę łatwo uzyskać blokadę na poziomie tabeli za pośrednictwem T-SQL? A może muszę bawić się mistrzem? Czy mogę łatwo wymusić przekroczenie limitu czasu bez blokowania? Każdy wkład jest mile widziany.

BnWasteland
źródło

Odpowiedzi:

131

uruchom to, a następnie wypróbuj swoją wkładkę ...

select * from yourTable with (holdlock,tablockx)

tutaj możesz go zablokować na 5 minut:

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION
KM.
źródło
Czy istnieje sposób, aby to zrobić z C # / .NET bez blokowania wątku, który wykonał to wywołanie SQL Server? Próbuję przetestować zachowanie mojej aplikacji podczas uzyskiwania połączenia. Ale jeśli wywołam ten kod z C #, nie wiem, jak uruchomić inne zapytanie, celowo doświadczając przekroczenia limitu czasu.
Jake Smith
33

Możesz po prostu powiedzieć swojemu kodowi sql, aby odczekał minutę przed zwróceniem:

WaitFor Delay '00:01:00'
David
źródło
Zagłosowano za prostotą odpowiedzi. Przetestowałem to i działa
Mikel
Zapełniałem tabelę i tworzyłem złożone zapytania rekurencyjne, buff, nonsens. To załatwia sprawę.
DanielV
10

Z drugiej strony: jeśli połączenie jest konfigurowalne, zmniejsz limit czasu parametrów połączenia do 1 sekundy - to ułatwi. Wypełnij tabelę mnóstwem danych i pozwól 3 innym procesom obracać się w pętli aktualizującej fragmenty tej tabeli transakcją wokół pętli. Nie zmieniaj faktycznej procedury wywoływanej przez aplikację (wstrzykiwanie waitfor). To unieważnia test integracji.

Ale tak naprawdę jest to studium przypadku na korzyść testów jednostkowych i wstrzykiwania zależności. Niektóre rzeczy są po prostu trudne do przetestowania. Test jednostkowy + iniekcja zależności .

  • Rzeczywiste: kod, który craps -> Limit czasu bazy danych (trudny do odtworzenia).
  • Refaktoryzacja: Kod, który craps -> Repozytorium (tylko dostęp do danych) -> Baza danych
  • Test jednostkowy: kod, który craps> Mock repozytorium do wyrzucenia -> null
  • Teraz masz zakończony niepowodzeniem test kodu, który powoduje błędy i może to naprawić.

To jest wstrzyknięcie „zależności”. Programista może wstrzyknąć zależność do bazy danych, zastępując coś, co symuluje zachowanie zależności. Dobrze zrobić dla wszystkich testów bazy danych. W każdym razie, po przeprowadzeniu testu jednostkowego, wiesz, że poprawka robi to, co powinna, ale nadal potrzebujesz testów integracyjnych. W takim przypadku może lepiej skupić się na regresji - co oznacza, że ​​testowanie niczego innego nie zepsuło, a funkcja nadal działa.

Już stworzyłeś swoją łatkę, więc myślę, że moja odpowiedź jest za późno.

Stromy
źródło