LCK_M_IS Wait Type in SQL Server

LCK_M_IS is a wait to acquire an Intent Shared (IS) lock. Before SQL Server takes a shared lock on a row or page, it places IS locks on the table and page above it, marking its intention so other sessions know readers are active lower down. This wait means even that lightweight intent marker is blocked, because something else holds an incompatible lock at the table or page level.

IS locks are compatible with almost everything. If a session cannot even get an IS lock, the blocker is holding something heavy, an exclusive (X) table lock, a schema modification lock, or a full table lock created by lock escalation.

Is It a Problem?

Any sustained LCK_M_IS time is worth a look, because it means readers are queuing behind whole-table locks. Short spikes during deployments or index operations are expected. If it shows up steadily during normal business hours, some process is regularly locking entire tables while readers wait.

Common Causes

  • Lock escalation: a large update or delete crossed the escalation threshold (roughly 5,000 locks) and SQL Server converted its row locks into one exclusive table lock.
  • Explicit TABLOCK or TABLOCKX hints in application code or ETL jobs.
  • Long-running transactions holding exclusive locks at the table level while readers stack up behind them.
  • DDL taking schema modification locks (covered separately under LCK_M_SCH_M).

What To Do

  1. Catch it live. sys.dm_os_waiting_tasks joined to sys.dm_exec_requests shows who is waiting and, more importantly, the blocking_session_id.
  2. Look at what the head blocker is running. A big modification that escalated to a table lock is the usual suspect.
  3. Break large modifications into smaller batches so they stay under the escalation threshold, or schedule them away from read activity.
  4. If reads must coexist with heavy writes, consider READ_COMMITTED_SNAPSHOT, which lets readers use row versions instead of shared locks. That removes the reader side of the queue, though writers still block writers.

How To See It

Rank it against everything else with Get-WaitStatistics. If LCK_M_IS is near the top, blocking is your problem, and the blocking scripts will show you the chain while it is happening.


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 *