2013-01-07 5 views
5

Ho impostato un blocco di isolamento della transazione serializzabile per una transazione.Ma sto osservando alcuni risultati che non sono previsti.blocco di isolamento della transazione serializzabile

La mia domanda è

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

Qui col1 è righe key.Here primarie con col1 avere valore 10,11,12 .... 19,20 sono bloccati per l'aggiornamento/inserimento. In condizioni in cui ho dato condizioni come col1> 10 e col1 < 20 ma ancora le righe con col1 = 10 e col1 = 20 vengono bloccate.

Se do

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

poi righe con valori aventi col2 da 9 a 21 ottiene locked.So perché col1 avendo 9 e 21 viene bloccato qui?

Per la query seguente viene chiusa la tabella completa.Here col3 è una colonna non primaria. Impossibile impostare il blocco se la colonna in cui condizione non è una chiave primaria?

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

risposta

4

Per chiave gamma di blocco di SQL Server deve utilizzare un indice per soddisfare la condizione di gamma in modo per quanto riguarda la vostra ultima query si avrebbe bisogno un indice su col3 (e possibilmente interrogazione suggerimenti per forzare il suo impiego se il piano non lo usa)

Inoltre, non blocca solo l'intervallo specifico nella clausola WHERE. Blocca le chiavi. Un blocco dell'intervallo su una chiave protegge l'intervallo da quel tasto in giù alla chiave successiva in modo che l'intervallo esatto che verrà bloccato dipende da quali chiavi esistono nell'indice.

Maggiori dettagli/collegamenti sono in my answer here

+0

Ma quale indice dovrebbero essere usati? Raggruppati o non raggruppati? – wincoding

+0

@wincoding - Non fa alcuna differenza che SQL Server possa prendere i blocchi dell'intervallo di chiavi sia purché utilizzi quell'indice per risolvere il 'WHERE' –