2013-01-07 12 views
5

Ustawiłem blokadę transakcji do serializacji dla transakcji. Ale obserwuję niektóre wyniki, które nie są oczekiwane.blokowanie transakcji z serializacją transakcji

Moje zapytanie jest

update tabl1 set col2 = 10 where col1 > 10 and col1 < 20 

Tutaj kol1 jest podstawowe rzędy key.Here z kol1 posiadające wartość 10,11,12 .... 19,20 są zablokowane do aktualizacji/wkładki. W którym warunku podałem warunki jako col1> 10 i col1 < 20, ale nadal wiersze mające col1 = 10 i col1 = 20 zostają zablokowane.

jeśli dam

update tabl1 set col2 = 10 where col1 => 10 and col1 <= 20 

następnie wiersze z COL2 wartości mających od 9 do 21 dostaje locked.So dlaczego kol1 po 9 i 21 zostaje tu zamknięty?

Dla poniższej kwerendy pełna tabela zostaje zablokowana.Tutaj col3 jest kolumną inną niż podstawowa.Czy nie mogę ustawić blokady, jeśli kolumna, w której warunek nie jest kluczem podstawowym?

update tabl1 set col2 = 10 where col3 > 10 and col3 < 20 

Odpowiedz

4

dla klucza blokującego Zakres SQL Server należy użyć indeksu do spełnienia warunku zakresu tak dotyczącą ostatniego zapytania będzie trzeba indeksu na col3 (i ewentualnie kwerendy podpowiedzi, aby wymusić jego wykorzystania, jeśli plan nie używać go)

Nie blokuje również określonego zakresu w klauzuli WHERE. Blokuje klucze. Blokada zasięgu na kluczu chroni zakres od tego klawisza w dół do następnego klawisza, więc dokładny zakres, który zostanie zablokowany, zależy od tego, jakie klawisze istnieją w indeksie.

Więcej szczegółów/linki są in my answer here

+0

Ale który wskaźnik powinien być stosowany? Klastry lub nie skupione? – wincoding

+0

@wincoding - Nie ma znaczenia, że ​​SQL Server może zabrać blokady z kluczem, dopóki używa tego indeksu do rozwiązania "WHERE" –