Groot verschil, TABLOCK
zal proberen "gedeelde" sloten te pakken, en TABLOCKX
exclusieve sloten.
Als je in een transactie zit en je grijpt een exclusief slot op een tafel, bijvoorbeeld:
SELECT 1 FROM TABLE WITH (TABLOCKX)
Geen enkel ander proces kan elke . pakken sloten op de tafel, wat betekent alles vragen die met de tafel proberen te praten, worden geblokkeerd totdat de transactie wordt vastgelegd.
TABLOCK
grijpt alleen een gedeelde vergrendeling, gedeelde vergrendelingen worden vrijgegeven nadat een instructie is uitgevoerd als uw transactie-isolatie READ COMMITTED
is (standaard). Als uw isolatieniveau hoger is, bijvoorbeeld:SERIALIZABLE
, gedeelde vergrendelingen worden vastgehouden tot het einde van een transactie.
Gedeelde sloten zijn, hmmm, gedeeld. Dit betekent dat 2 transacties tegelijkertijd gegevens van de tafel kunnen lezen als ze allebei een S- of IS-slot op de tafel hebben (via TABLOCK
). Als echter transaction A
heeft een gedeeld slot op een tafel, transaction B
kan een exclusief slot pas pakken als alle gedeelde sloten zijn vrijgegeven. Lees op msdn welke sloten compatibel zijn.
Beide hints zorgen ervoor dat de db het nemen van meer gedetailleerde vergrendelingen (zoals vergrendelingen op rij- of paginaniveau) overslaat. In principe zorgen meer granulaire sloten voor een betere gelijktijdigheid. De ene transactie kan bijvoorbeeld rij 100 in uw tabel bijwerken en een andere rij 1000, tegelijkertijd van twee transacties (het wordt lastig met paginavergrendelingen, maar laten we dat overslaan).
Over het algemeen is granulaire vergrendelingen wat u wilt, maar soms wilt u db-concurrency verminderen om de prestaties van een bepaalde bewerking te verbeteren en de kans op impasses te elimineren.
Over het algemeen zou u TABLOCK
. niet gebruiken of TABLOCKX
tenzij je het absoluut nodig had voor een edge-case.