LCK_M_IX Wait Type in SQL Server

LCK_M_IX is a wait to acquire an Intent Exclusive (IX) lock. When SQL Server modifies a row, it first stamps IX locks on the page and table above it, signalling that exclusive locks exist lower down. This wait means a writer cannot even place that intent marker, because another session holds an incompatible lock at the table or page level.

IX locks are compatible with other intent locks, so writers do not normally queue here. When they do, the blocker holds something table-wide: a shared (S) table lock, an exclusive (X) table lock, or a schema lock.

Is It a Problem?

Yes, if it is sustained. LCK_M_IX means modifications are being held up at the table level, which usually stalls inserts, updates, and deletes visibly for users. Brief appearances during index maintenance or reporting jobs that scan with table locks are more forgivable, but the writers are still paying for it.

Common Causes

  • A large scan holding a shared table lock, often a report or export running with TABLOCK, or a scan escalated to a table-level S lock.
  • Lock escalation from another writer that turned row locks into an exclusive table lock.
  • SERIALIZABLE isolation (often introduced silently by distributed transactions or some ORMs) holding range locks that widen the blocking surface.
  • Offline index operations holding table locks while writers queue.

What To Do

  1. Find the head blocker in sys.dm_os_waiting_tasks while the wait is live. The resource_description tells you the object being fought over.
  2. If a reporting query with table hints is blocking writers, remove the hint, or move the report to a readable replica or snapshot isolation.
  3. Batch large modifications to stay under the lock escalation threshold, and keep transactions short so table-level locks are held for milliseconds, not minutes.
  4. Check sys.dm_db_index_operational_stats for the table to confirm which index the contention concentrates on.

How To See It

Rank it against everything else with Get-WaitStatistics. High LCK_M_IX alongside LCK_M_X and LCK_M_S means a genuine blocking pattern, not an isolated event.


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 *