Stor skillnad, TABLOCK
kommer att försöka ta tag i "delade" lås och TABLOCKX
exklusiva lås.
Om du är i en transaktion och du tar ett exklusivt lås på ett bord, t.ex.:
SELECT 1 FROM TABLE WITH (TABLOCKX)
Inga andra processer kommer att kunna ta tag i någon lås på bordet, vilket betyder alla frågor som försöker prata med bordet kommer att blockeras tills transaktionen genomförs.
TABLOCK
tar bara tag i ett delat lås, delade lås släpps efter att ett uttalande har körts om din transaktionsisolering är READ COMMITTED
(standard). Om din isoleringsnivå är högre, till exempel:SERIALIZABLE
, delade lås hålls kvar till slutet av en transaktion.
Delade lås är, hmmm, delade. Det betyder att 2 transaktioner båda kan läsa data från tabellen samtidigt om de båda har ett S- eller IS-lås på bordet (via TABLOCK
). Men om transaction A
har ett delat lås på ett bord, transaction B
kommer inte att kunna ta tag i ett exklusivt lås förrän alla delade lås har släppts. Läs om vilka lås som är kompatibla med vilka på msdn.
Båda tipsen gör att db:n går förbi att ta mer granulära lås (som rad- eller sidnivålås). I princip ger mer granulära lås dig bättre samtidighet. Så till exempel kan en transaktion vara att uppdatera rad 100 i din tabell och en annan rad 1000, samtidigt från två transaktioner (det blir knepigt med sidlås, men låt oss hoppa över det).
I allmänhet är granulära lås vad du vill, men ibland kanske du vill minska db samtidighet för att öka prestandan för en viss operation och eliminera risken för dödläge.
I allmänhet skulle du inte använda TABLOCK
eller TABLOCKX
såvida du inte absolut behövde det för något kantfodral.