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
- Identify the statement waiting on SIX via
sys.dm_os_waiting_tasksandsys.dm_exec_requests. The query text usually makes the scan-then-update pattern obvious. - 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.
- Serialize competing jobs. If two instances of the same batch process fight each other, run them in sequence or partition their key ranges.
- 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.
Leave a Reply