Blokowanie kursor
In Microsoft SQL Server, the SELECT statement in a cursor definition is subject to the same transaction locking rules that apply to any other SELECT statement.W kursory jednak dodatkowy zestaw blokad przewijania może przejąć na podstawie specyfikacji poziom współbieżność kursor.
Blokady transakcji nabytych przez wszystkich instrukcja SELECT, łącznie z instrukcja SELECT w definicji kursor, są kontrolowane przez:
Ustawienie poziom izolacji transakcji dla połączenia.
Wszystkie określone w klauzula FROM wskazówki blokowania.
Te blokady są przechowywane aż do końca bieżącej transakcji dla instrukcji SELECT, niezależne i kursorów.Kiedy SQL Server działa tryb automatycznego zatwierdzania każdego indywidualnego instrukcja języka SQL jest transakcją i blokady są zwalniane po zakończeniu wykonywania instrukcji. Jeśli SQL Server jest uruchomiony w trybie transakcji bezpośrednie lub pośrednie, a następnie blokad są przechowywane aż do chwili, kiedy transakcja przekazana lub wycofana.
Na przykład blokowaniem dla tych dwóch Transact-SQL Przykłady jest zasadniczo taki sam:
/* Example 1 */
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
GO
SELECT * FROM AdventureWorks.Sales.Store;
GO
/* Example 2 */
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
GO
DECLARE abc CURSOR STATIC FOR
SELECT * FROM AdventureWorks.Sales.Store;
GO
OPEN abc
GO
Poziom izolacji transakcji do powtarzalnych odczytu oznacza, że zarówno niezależnych instrukcja SELECT w przykładzie 1 i instrukcja SELECT w DECLARE kursor 2 przykład wygenerować udostępnianie blokad dla każdego wiersza je odczytać i blokad udziału są przechowywane aż do chwili, kiedy transakcja jest przekazana lub wycofana.
Pobieranie blokady
Mimo że kursory przestrzegać tych samych zasad jako niezależny instrukcji SELECT, dotyczących typu blokady transakcji, blokady są nabywane w różnym czasie.Zawsze są nabywane blokad generowane przez niezależnych SELECT lub kursor, po pobraniu wiersza.Wszystkie wiersze są pobierane niezależnych SELECT po wykonaniu instrukcja.Kursory, jednak pobrać wiersze w różnym czasie, w zależności od typu kursor:
Statyczne kursory pobrać cały wynik na czas kursor jest otwarty.To blokuje każdy wiersz wyniku na otwieranie czas.
Zestaw kluczy o zmiennych kursory pobrać kluczy każdego wiersza na wynik czas kursor jest otwarty.To blokuje każdy wiersz wyniku na otwieranie czas.
Dopóki nie są one pobierane wiersze nie pobrać dynamiczne kursory (łącznie z regularnym kursory tylko przesyłanie dalej).Blokady nie są nabywane w wierszach, aż do ich pobrania.
Szybko do przodu tylko kursory różnić się w ich nabycia ich blokad w zależności od plan wykonania, wybranego przez optymalizator kwerendy.Plan dynamiczny, jeśli została wybrana blokady nie są pobierane dopóki pobierane wiersze.Jeśli worktables są generowane, a następnie wiersze są wczytuje do worktable i zablokowany na otwarty czas.
Kursory obsługują również własne specyfikacji współbieżność, niektóre z nich generuje dodatkowe blokady w wierszach w każdego pobrania.Te blokady przewijania są przechowywane aż do następnej operacji pobierania, lub do czasu zamknięcia kursor w zależności od tego, co nastąpi najpierw.Jeśli ustawiono opcję połączenia, aby pozostawić otwarte kursory na zatwierdzanie na, blokad te będą przechowywane przez zatwierdzanie lub wycofywanie operacji.