sql >> Databasteknik >  >> RDS >> Sqlserver

TABLOCK vs TABLOCKX

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.



  1. Ändra decimalavgränsare i MySQL

  2. Markörbaserade poster i PostgreSQL

  3. Ta bort alla blanksteg från en sträng i SQL Server

  4. Hur infogar jag korrekt flera rader i PG med nod-postgres?