Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

TABLOCK vs TABLOCKX

Grande differenza, TABLOCK proverà a prendere i blocchi "condivisi" e TABLOCKX serrature esclusive.

Se sei in una transazione e prendi un blocco esclusivo su un tavolo, EG:

SELECT 1 FROM TABLE WITH (TABLOCKX)

Nessun altro processo sarà in grado di acquisire qualsiasi si blocca sul tavolo, ovvero tutti le query che tentano di comunicare con il tavolo verranno bloccate fino al completamento della transazione.

TABLOCK acquisisce solo un blocco condiviso, i blocchi condivisi vengono rilasciati dopo l'esecuzione di un'istruzione se l'isolamento della transazione è READ COMMITTED (predefinito). Se il tuo livello di isolamento è più alto, ad esempio:SERIALIZABLE , i blocchi condivisi vengono mantenuti fino alla fine di una transazione.

I blocchi condivisi sono, hmmm, condivisi. Significato che 2 transazioni possono entrambe leggere i dati dalla tabella contemporaneamente se entrambe mantengono un blocco S o IS sulla tabella (tramite TABLOCK ). Tuttavia, se transaction A detiene un blocco condiviso su un tavolo, transaction B non sarà in grado di acquisire un blocco esclusivo fino al rilascio di tutti i blocchi condivisi. Leggi quali blocchi sono compatibili con quali su msdn.

Entrambi i suggerimenti fanno sì che il db ignori l'assunzione di blocchi più granulari (come i blocchi a livello di riga o pagina). In linea di principio, blocchi più granulari consentono una migliore concorrenza. Ad esempio, una transazione potrebbe aggiornare la riga 100 nella tabella e un'altra riga 1000, contemporaneamente da due transazioni (diventa complicato con i blocchi di pagina, ma lasciamo perdere).

In generale, i blocchi granulari sono ciò che desideri, ma a volte potresti voler ridurre la concorrenza db per aumentare le prestazioni di una particolare operazione ed eliminare la possibilità di deadlock.

In generale non useresti TABLOCK o TABLOCKX a meno che tu non ne abbia assolutamente bisogno per qualche caso limite.