LCK_M_SIX Wait Type in SQL Server

LCK_M_SIX is a wait to acquire a Shared With Intent Exclusive (SIX) lock. SIX is a combination lock: the session wants to read the whole table (shared) while also modifying some rows within it (intent exclusive). SQL Server uses it for scan-then-update patterns, where a query reads broadly but writes selectively.

You will see this wait when a session needs that combined table-level lock and another session already holds something incompatible, which for SIX is almost everything except intent shared.

Is It a Problem?

LCK_M_SIX is one of the rarer lock waits, so any meaningful amount of it stands out. It usually points at a specific query pattern, typically an UPDATE driven by a scan, colliding with concurrent readers or writers on the same table. It rarely dominates a wait profile on its own; treat it as a clue about one workload rather than a server-wide condition.

Common Causes

  • Updates or deletes that scan the table because no useful index exists for the predicate, forcing broad shared access plus row-level writes.
  • Two sessions running the same scan-then-update job at once, each blocking the other’s table-level lock upgrade.
  • Concurrent readers holding shared table locks (report queries with TABLOCK) while an updater needs SIX.

What To Do

  1. Identify the statement waiting on SIX via sys.dm_os_waiting_tasks and sys.dm_exec_requests. The query text usually makes the scan-then-update pattern obvious.
  2. Index the predicate. If the update can seek instead of scan, it takes narrow intent locks instead of a table-wide SIX, and the wait disappears.
  3. Serialize competing jobs. If two instances of the same batch process fight each other, run them in sequence or partition their key ranges.
  4. Keep the transaction around the update as short as possible so the SIX lock, once granted, is released quickly.

How To See It

Rank it against everything else with Get-WaitStatistics. If LCK_M_SIX appears at all prominently, one query pattern is responsible, and the fix is usually an index.


Part of the SQL Server Wait Types Library.
Related deep dive: LCK_M_X, LCK_M_S, and LCK_M_U Wait Types.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *