{"id":1104,"date":"2008-01-14T22:10:00","date_gmt":"2008-01-14T22:10:00","guid":{"rendered":"\/blogs\/paul\/post\/SQL-Server-2008-Partition-level-lock-escalation-details-and-examples.aspx"},"modified":"2015-05-14T11:15:00","modified_gmt":"2015-05-14T18:15:00","slug":"sql-server-2008-partition-level-lock-escalation-details-and-examples","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/","title":{"rendered":"SQL Server 2008: Partition-level lock escalation details and examples"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p>Back in October 2007 I blogged about partition-level lock escalation in SQL Server 2008 (see <a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-lock-escalation-changes\/\" target=\"_blank\">here<\/a>) and I promised to do a follow-up once CTP-5 came out with syntax etc. So here it is.<\/p>\n<p>A brief recap &#8211; lock escalation in SQL Server 2005 and before only allowed table-level lock escalation. If you have a partitioned table with queries going against different partitions, then table-level escalation is a pain because the whole table is suddenly locked and concurrent queries against distinct partitions can&#8217;t run. SQL Server 2008 gives the ability to escalate to a parttition lock, which won&#8217;t affect the queries on the other partitions.<\/p>\n<p>The lock escalation policy can only be set with ALTER TABLE after\u00a0a table has been created, and the policy can only be set at the table level. The syntax is<\/p>\n<p>&nbsp;<\/p>\n<blockquote dir=\"ltr\" style=\"margin-right: 0px;\"><p><span style=\"font-family: 'Courier New';\"><span style=\"color: #0000ff;\">ALTER TABLE<\/span>\u00a0TableName <span style=\"color: #0000ff;\">SET<\/span> (LOCK_ESCALATION = TABLE | AUTO | DISABLE);<\/span><\/p><\/blockquote>\n<p dir=\"ltr\">The options mean:<\/p>\n<ul>\n<li>\n<div><strong><span style=\"font-family: 'Courier New';\">TABLE<\/span> &#8211; <\/strong>escalation will always be to the table level. This is the default.<\/div>\n<\/li>\n<li>\n<div><strong><span style=\"font-family: 'Courier New';\">AUTO<\/span><\/strong> &#8211; escalation will be to the partition level if the table is partitioned; otherwise it will be to the table level<\/div>\n<\/li>\n<li>\n<div><strong><span style=\"font-family: 'Courier New';\">DISABLE<\/span><\/strong> &#8211; escalation will be disabled. This does not guarantee that it will NEVER occur &#8211; there are some cases where it is necessary (Books Online gives the example of scanning a heap in the <span style=\"font-family: 'Courier New';\">SERIALIZABLE<\/span> isolation level)<\/div>\n<\/li>\n<\/ul>\n<p>The only way I could find to check what the escalation policy for a table is set to is to use the <span style=\"font-family: 'Courier New';\">sys.tables<\/span> catalog view:<\/p>\n<blockquote dir=\"ltr\" style=\"margin-right: 0px;\"><p>&nbsp;<\/p>\n<p><span style=\"font-family: 'Courier New';\">SELECT<\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #000000; font-size: small;\"> lock_escalation_desc <\/span><span style=\"color: #0000ff; font-size: small;\">FROM<\/span><span style=\"color: #000000; font-size: small;\"> sys.tables <\/span><span style=\"color: #0000ff; font-size: small;\">WHERE<\/span> <span style=\"color: #0000ff; font-size: small;\">name<\/span> <span style=\"color: #808080; font-size: small;\">=<\/span> <span style=\"color: #ff0000; font-size: small;\">&#8216;TableName&#8217;<\/span><span style=\"color: #808080; font-size: small;\">;<\/span><\/span><\/p>\n<p>&nbsp;<\/p><\/blockquote>\n<p>Let&#8217;s try it out. Here&#8217;s a script that creates a database with an example table with 3 partitions. The partition ranges are negative infinity to 7999, 8000 to 15999, 16000 to positive infinity.<\/p>\n<blockquote dir=\"ltr\" style=\"margin-right: 0px;\"><p>&nbsp;<\/p>\n<p><span style=\"font-family: 'Courier New';\">CREATE<\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">DATABASE<\/span><span style=\"color: #000000; font-size: small;\"> LockEscalationTest<\/span><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'; font-size: small;\">GO<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: 'Courier New';\">USE<\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #000000; font-size: small;\"> LockEscalationTest<\/span><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'; font-size: small;\">GO<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&#8212; Create three partitions: -7999, 8000-15999, 16000+<br \/>\n<span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">CREATE<\/span><\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">PARTITION<\/span> <span style=\"color: #0000ff; font-size: small;\">FUNCTION<\/span><span style=\"color: #000000; font-size: small;\"> MyPartitionFunction <\/span><span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #0000ff; font-size: small;\">INT<\/span><span style=\"color: #808080; font-size: small;\">) <\/span><\/span><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">AS<\/span><\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">RANGE<\/span> <span style=\"color: #808080; font-size: small;\">RIGHT<\/span> <span style=\"color: #0000ff; font-size: small;\">FOR<\/span> <span style=\"color: #0000ff; font-size: small;\">VALUES<\/span> <span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #000000; font-size: small;\">8000<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> 16000<\/span><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'; font-size: small;\">GO<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: 'Courier New';\">CREATE<\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">PARTITION<\/span> <span style=\"color: #0000ff; font-size: small;\">SCHEME<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\"> MyPartitionScheme <\/span><\/span><\/span><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">AS<\/span><\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">PARTITION<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\"> MyPartitionFunction<br \/>\n<\/span><\/span><\/span><span style=\"color: #808080; font-size: small;\"><span style=\"font-family: 'Courier New';\">ALL<\/span><\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">TO<\/span> <span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #000000; font-size: small;\">[PRIMARY]<\/span><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'; font-size: small;\">GO<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&#8212; Create a partitioned table<br \/>\n<span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">CREATE<\/span><\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">TABLE<\/span><span style=\"color: #000000; font-size: small;\"> MyPartitionedTable <\/span><span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #000000; font-size: small;\">c1 <\/span><span style=\"color: #0000ff; font-size: small;\">INT<\/span><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'; font-size: small;\">GO<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: 'Courier New';\">CREATE<\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">CLUSTERED<\/span> <span style=\"color: #0000ff; font-size: small;\">INDEX<\/span><span style=\"color: #000000; font-size: small;\"> MPT_Clust <\/span><span style=\"color: #0000ff; font-size: small;\">ON<\/span><span style=\"color: #000000; font-size: small;\"> MyPartitionedTable <\/span><span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #000000; font-size: small;\">c1<\/span><span style=\"color: #808080; font-size: small;\">)<br \/>\n<\/span><\/span><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">ON<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #000000; font-size: small;\"> MyPartitionScheme <\/span><span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #000000; font-size: small;\">c1<\/span><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'; font-size: small;\">GO<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&#8212; Fill the table<br \/>\n<span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">SET<\/span><\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #0000ff; font-size: small;\">NOCOUNT<\/span> <span style=\"color: #0000ff; font-size: small;\">ON<\/span><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'; font-size: small;\">GO<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: 'Courier New';\">DECLARE<\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #000000; font-size: small;\"> @a <\/span><span style=\"color: #0000ff; font-size: small;\">INT<\/span> <span style=\"color: #808080; font-size: small;\">=<\/span><span style=\"color: #000000; font-size: small;\"> 1<\/span><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><\/span><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">WHILE<\/span><\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #000000; font-size: small;\">@a <\/span><span style=\"color: #808080; font-size: small;\">&lt;<\/span><span style=\"color: #000000; font-size: small;\"> 17000<\/span><span style=\"color: #808080; font-size: small;\">)<br \/>\n<\/span><\/span><span style=\"color: #0000ff; font-family: 'Courier New'; font-size: small;\">BEGIN<br \/>\n<\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #0000ff; font-size: small;\">INSERT<\/span> <span style=\"color: #0000ff; font-size: small;\">INTO<\/span><span style=\"font-size: small;\"> MyPartitionedTable <\/span><span style=\"color: #0000ff; font-size: small;\">VALUES<\/span> <span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"font-size: small;\">@a<\/span><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #0000ff; font-size: small;\">SELECT<\/span><span style=\"font-size: small;\"> @a <\/span><span style=\"color: #808080; font-size: small;\">=<\/span><span style=\"font-size: small;\"> @a <\/span><span style=\"color: #808080; font-size: small;\">+<\/span><span style=\"font-size: small;\"> 1<\/span><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><\/span><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">END<\/span><\/span><span style=\"color: #808080; font-size: small;\"><span style=\"font-family: 'Courier New';\">;<br \/>\n<\/span><\/span><span style=\"font-family: 'Courier New'; font-size: small;\">GO<\/span><\/p>\n<p>&nbsp;<\/p><\/blockquote>\n<p dir=\"ltr\"><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"font-family: Verdana;\">Now I&#8217;m going to explicitly set the escalation to TABLE and start a transaction that should cause lock escalation.<\/span><\/span><\/p>\n<blockquote>\n<p dir=\"ltr\"><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\">ALTER <span style=\"color: #0000ff; font-size: small;\">TABLE<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\"> MyPartitionedTable <\/span><\/span><span style=\"color: #0000ff; font-size: small;\">SET<\/span> <span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #000000; font-size: small;\">LOCK_ESCALATION <\/span><span style=\"color: #808080; font-size: small;\">=<\/span> <span style=\"color: #0000ff; font-size: small;\">TABLE<\/span><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/p>\n<p dir=\"ltr\"><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\">BEGIN <span style=\"color: #0000ff; font-size: small;\">TRAN<br \/>\nUPDATE<\/span><span style=\"color: #000000; font-size: small;\"> MyPartitionedTable <\/span><span style=\"color: #0000ff; font-size: small;\">SET<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">=<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #0000ff; font-size: small;\">WHERE<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">&lt;<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\"> 7500;<br \/>\n<\/span><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/span><\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #000000; font-family: Verdana;\">We should be able to see the locks being held:<\/span><\/span><\/span><\/span><\/span><\/p>\n<blockquote><p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #0000ff; font-size: small;\">SELECT<span style=\"color: #000000; font-size: small;\"> [resource_type]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [resource_associated_entity_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [request_mode]<\/span><span style=\"color: #808080; font-size: small;\">,<br \/>\n<\/span><span style=\"color: #000000; font-size: small;\">[request_type]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"font-size: small;\"> <span style=\"color: #000000;\">[request_status]<\/span> <\/span><span style=\"color: #0000ff; font-size: small;\">FROM<\/span> <span style=\"color: #008000; font-size: small;\">sys.dm_tran_locks<\/span> <span style=\"color: #0000ff; font-size: small;\">WHERE<\/span><span style=\"font-size: small;\"> <span style=\"color: #000000;\">[resource_type]<\/span> <\/span><span style=\"color: #808080; font-size: small;\">&lt;&gt;<\/span> <span style=\"color: #ff0000; font-size: small;\">&#8216;DATABASE&#8217;<\/span><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #000000; font-size: small;\">resource_type\u00a0\u00a0 resource_associated_entity_id request_mode\u00a0\u00a0 request_type\u00a0\u00a0 request_status<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nOBJECT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2105058535\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 X\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<\/span><\/span><\/span><\/span><\/span><\/p><\/blockquote>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-family: verdana, geneva;\"><span style=\"font-size: small;\"><span style=\"color: #000000;\">Just as we expected &#8211; an X table lock. Trying any query against the table fails now. Now I&#8217;ll rollback that transaction, set the escalation to partition-level and try again.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<blockquote><p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #0000ff; font-size: small;\">ROLLBACK <span style=\"color: #0000ff; font-size: small;\">TRAN<\/span><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #0000ff; font-size: small;\">ALTER <span style=\"color: #0000ff; font-size: small;\">TABLE<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\"> MyPartitionedTable <\/span><\/span><span style=\"color: #0000ff; font-size: small;\">SET<\/span> <span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #000000; font-size: small;\">LOCK_ESCALATION <\/span><span style=\"color: #808080; font-size: small;\">=<\/span> <span style=\"color: #0000ff; font-size: small;\">AUTO<\/span><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><span style=\"color: #808080; font-size: small;\"><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #0000ff; font-size: small;\">BEGIN <span style=\"color: #0000ff; font-size: small;\">TRAN<br \/>\nUPDATE<\/span><span style=\"color: #000000; font-size: small;\"> MyPartitionedTable <\/span><span style=\"color: #0000ff; font-size: small;\">SET<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">=<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #0000ff; font-size: small;\">WHERE<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">&lt;<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\"> 7500;<br \/>\n<\/span><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #0000ff; font-size: small;\">SELECT<span style=\"color: #000000; font-size: small;\"> [partition_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [object_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [index_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\"> [partition_number]<br \/>\n<\/span><\/span><span style=\"color: #0000ff; font-size: small;\">FROM<\/span> <span style=\"color: #008000; font-size: small;\">sys.partitions<\/span> <span style=\"color: #0000ff; font-size: small;\">WHERE<\/span> <span style=\"color: #ff00ff; font-size: small;\">object_id<\/span> <span style=\"color: #808080; font-size: small;\">=<\/span> <span style=\"color: #ff00ff; font-size: small;\">OBJECT_ID<\/span> <span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #ff0000; font-size: small;\">&#8216;MyPartitionedTable&#8217;<\/span><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #0000ff; font-size: small;\">SELECT<span style=\"color: #000000; font-size: small;\"> [resource_type]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [resource_associated_entity_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [request_mode]<\/span><span style=\"color: #808080; font-size: small;\">,<br \/>\n<\/span><span style=\"color: #000000; font-size: small;\">[request_type]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"font-size: small;\"> <span style=\"color: #000000;\">[request_status]<\/span> <\/span><span style=\"color: #0000ff; font-size: small;\">FROM<\/span> <span style=\"color: #008000; font-size: small;\">sys.dm_tran_locks<\/span> <span style=\"color: #0000ff; font-size: small;\">WHERE<\/span><span style=\"font-size: small;\"> <span style=\"color: #000000;\">[resource_type]<\/span> <\/span><span style=\"color: #808080; font-size: small;\">&lt;&gt;<\/span> <span style=\"color: #ff0000; font-size: small;\">&#8216;DATABASE&#8217;<\/span><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #000000;\">partition_id\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 object_id\u00a0\u00a0 index_id\u00a0\u00a0\u00a0 partition_number<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n<strong>72057594039042048\u00a0\u00a0\u00a0 2105058535\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1<br \/>\n<\/strong>72057594039107584\u00a0\u00a0\u00a0 2105058535\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2<br \/>\n72057594039173120\u00a0\u00a0\u00a0 2105058535\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3<\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #000000;\">resource_type\u00a0\u00a0 resource_associated_entity_id request_mode\u00a0\u00a0 request_type\u00a0\u00a0 request_status<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n<strong>HOBT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 72057594039042048\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 X<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nOBJECT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2105058535\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IX\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<\/span><\/span><\/span><\/span><\/span><\/span><\/p><\/blockquote>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-size: small;\"><span style=\"font-family: Verdana;\"><span style=\"color: #000000;\">Excellent &#8211; the object lock is now IX rather than X, and the X lock is at the partition (HOBT) level for partition 1 (see the bold highlighting to match the partition ID with the lock resource). (For an explanation of HOBTs, see my post <\/span><span style=\"color: #000000;\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/inside-the-storage-engine-iam-pages-iam-chains-and-allocation-units\/\" target=\"_blank\">Inside The Storage Engine: IAM pages, IAM chains, and allocation units<\/a><\/span><span style=\"color: #000000;\">.) So now we should be able to do something with another partition &#8211; let&#8217;s see if we can cause another partition level X lock in another connection:<\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<blockquote><p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: Verdana;\"><span style=\"color: #003300; font-family: Verdana;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">USE<\/span><span style=\"color: #000000; font-family: 'Courier New'; font-size: small;\"> LockEscalationTest<\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><span style=\"font-size: small;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: Verdana;\"><span style=\"color: #003300; font-family: Verdana;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">BEGIN<\/span><\/span> <span style=\"font-family: 'Courier New';\"><span style=\"color: #0000ff; font-size: small;\">TRAN<br \/>\nUPDATE<\/span><span style=\"color: #000000; font-size: small;\"> MyPartitionedTable <\/span><span style=\"color: #0000ff; font-size: small;\">set<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">=<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #0000ff; font-size: small;\">WHERE<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">&gt;<\/span><span style=\"color: #000000; font-size: small;\"> 8100 <\/span><span style=\"color: #808080; font-size: small;\">AND<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">&lt;<\/span><span style=\"color: #000000; font-size: small;\"> 15900<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><span style=\"font-size: small;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: Verdana;\"><span style=\"font-size: small;\"><span style=\"font-family: 'Courier New';\"><span style=\"color: #0000ff;\">SELECT<\/span><span style=\"color: #000000; font-size: small;\"> [partition_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [object_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [index_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"font-size: small;\"><span style=\"color: #000000;\"> [partition_number]<br \/>\n<\/span><\/span><span style=\"color: #0000ff; font-size: small;\">FROM<\/span> <span style=\"color: #008000; font-size: small;\">sys.partitions<\/span> <span style=\"color: #0000ff; font-size: small;\">WHERE<\/span> <span style=\"color: #ff00ff; font-size: small;\">object_id<\/span> <span style=\"color: #808080; font-size: small;\">=<\/span> <span style=\"color: #ff00ff; font-size: small;\">OBJECT_ID<\/span> <span style=\"color: #808080; font-size: small;\">(<\/span><span style=\"color: #ff0000; font-size: small;\">&#8216;MyPartitionedTable&#8217;<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #808080; font-size: small;\">);<br \/>\n<\/span><span style=\"font-size: small;\"><span style=\"color: #000000;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: Verdana;\"><span style=\"font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">SELECT<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #000000; font-size: small;\"> [resource_type]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [resource_associated_entity_id]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"color: #000000; font-size: small;\"> [request_mode]<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #808080; font-size: small;\">,<br \/>\n<\/span><span style=\"color: #000000; font-size: small;\">[request_type]<\/span><span style=\"color: #808080; font-size: small;\">,<\/span><span style=\"font-size: small;\"> <span style=\"color: #000000;\">[request_status]<\/span> <\/span><span style=\"color: #0000ff; font-size: small;\">FROM<\/span> <span style=\"color: #008000; font-size: small;\">sys.dm_tran_locks<\/span> <span style=\"color: #0000ff; font-size: small;\">WHERE<\/span><span style=\"font-size: small;\"> <span style=\"color: #000000;\">[resource_type]<\/span> <\/span><span style=\"color: #808080;\"><span style=\"font-size: small;\">&lt;&gt;<\/span> <\/span><span style=\"color: #ff0000; font-size: small;\">&#8216;DATABASE&#8217;<\/span><\/span><span style=\"color: #808080; font-family: 'Courier New'; font-size: small;\">;<br \/>\n<\/span><span style=\"font-size: small;\"><span style=\"color: #000000; font-family: 'Courier New';\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: Verdana;\"><span style=\"font-size: small;\"><span style=\"font-family: 'Courier New';\">partition_id\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 object_id\u00a0\u00a0 index_id\u00a0\u00a0\u00a0 partition_number<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n<strong><span style=\"color: #ff0000;\">72057594039042048\u00a0\u00a0\u00a0 2105058535\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1<\/span><\/strong><br \/>\n<strong><span style=\"color: #0000ff;\">72057594039107584\u00a0\u00a0\u00a0 2105058535\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2<\/span><\/strong><br \/>\n72057594039173120\u00a0\u00a0\u00a0 2105058535\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3<\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: Verdana;\"><span style=\"font-size: small;\"><span style=\"font-family: 'Courier New';\">resource_type\u00a0\u00a0 resource_associated_entity_id request_mode\u00a0\u00a0 request_type\u00a0\u00a0 request_status<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n<strong><span style=\"color: #0000ff;\">HOBT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 72057594039107584\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 X<\/span><\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\n<strong><span style=\"color: #ff0000;\">HOBT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 72057594039042048\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 X<\/span><\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nMETADATA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Sch-S\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nOBJECT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2105058535\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IX\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<br \/>\nOBJECT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2105058535\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IX\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GRANT<\/span><\/span><\/span><\/span><\/span><\/span><\/p><\/blockquote>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: Verdana;\"><span style=\"font-size: small;\"><span style=\"font-size: small;\"><span style=\"color: #003300; font-family: Verdana;\">Now we have two partition X locks, for partitions 1 and 2 (as expected &#8211; use the color coding above to match up the IDs), plus two table-level IX locks (one for each\u00a0 connection, as expected). Very cool!<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"color: #003300; font-family: Verdana;\">Now I&#8217;m going to force a deadlock &#8211; by having each connection try to read a row from the other locked partition:<\/span><\/span><\/span><\/span><\/p>\n<blockquote><p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"color: #003300; font-family: Verdana;\">Connection 1:<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"color: #003300; font-family: Verdana;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">SELECT<\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #808080; font-size: small;\">*<\/span> <span style=\"color: #0000ff; font-size: small;\">FROM<\/span><span style=\"color: #000000; font-size: small;\"> MyPartitionedTable <\/span><span style=\"color: #0000ff; font-size: small;\">WHERE<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">=<\/span><span style=\"color: #000000; font-size: small;\"> 8500<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><span style=\"font-size: small;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"color: #003300; font-family: Verdana;\">Connection 2:<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"color: #003300; font-family: Verdana;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"font-family: 'Courier New';\">SELECT<\/span><span style=\"font-family: 'Courier New';\"> <span style=\"color: #808080; font-size: small;\">*<\/span> <span style=\"color: #0000ff; font-size: small;\">FROM<\/span><span style=\"color: #000000; font-size: small;\"> MyPartitionedTable <\/span><span style=\"color: #0000ff; font-size: small;\">WHERE<\/span><span style=\"color: #000000; font-size: small;\"> c1 <\/span><span style=\"color: #808080; font-size: small;\">=<\/span><span style=\"color: #000000; font-size: small;\"> 100<\/span><\/span><span style=\"font-family: 'Courier New';\"><span style=\"color: #808080; font-size: small;\">;<br \/>\n<\/span><span style=\"font-size: small;\">GO<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p><\/blockquote>\n<p><span style=\"font-size: small;\">Connection 2 succeeds but on connection 1 we get (as expected) <\/span><\/p>\n<blockquote><p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"color: #003300; font-family: Verdana;\"><span style=\"font-size: small;\"><span style=\"color: #ff0000; font-family: 'Courier New';\">(local)\\SQLDEV01(SQLHAVPC\\Administrator): Msg 1205, Level 13, State 18, Line 1<br \/>\nTransaction (Process ID 51) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.<\/span><\/span><\/span><\/span><\/span><\/span><\/p><\/blockquote>\n<p><span style=\"font-family: 'Courier New'; font-size: small;\"><span style=\"color: #808080; font-size: small;\"><span style=\"color: #0000ff; font-size: small;\"><span style=\"color: #003300; font-family: Verdana;\"><span style=\"font-size: small;\">This illustrates a potential problem with this new mechanism &#8211; applications that used to rely on the blocking nature of X table locks may now exhibit deadlocks if partition-level escalation is turned on in production without any testing, this mode was specifically chosen NOT to be the default setting for new tables because some trial workloads exhibited deadlocks during testing. Don&#8217;t just turn it on in production without testing &#8211; as with any other option or feature. <\/span><\/span><\/span><\/span><\/span><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Back in October 2007 I blogged about partition-level lock escalation in SQL Server 2008 (see here) and I promised to do a follow-up once CTP-5 came out with syntax etc. So here it is. A brief recap &#8211; lock escalation in SQL Server 2005 and before only allowed table-level lock escalation. If you have [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38,57,65,86],"tags":[],"class_list":["post-1104","post","type-post","status-publish","format-standard","hentry","category-example-scripts","category-locking","category-partitioning","category-sql-server-2008"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SQL Server 2008: Partition-level lock escalation details and examples - Paul S. Randal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server 2008: Partition-level lock escalation details and examples - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Back in October 2007 I blogged about partition-level lock escalation in SQL Server 2008 (see here) and I promised to do a follow-up once CTP-5 came out with syntax etc. So here it is. A brief recap &#8211; lock escalation in SQL Server 2005 and before only allowed table-level lock escalation. If you have [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2008-01-14T22:10:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-05-14T18:15:00+00:00\" \/>\n<meta name=\"author\" content=\"Paul Randal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paul Randal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/\",\"name\":\"SQL Server 2008: Partition-level lock escalation details and examples - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"datePublished\":\"2008-01-14T22:10:00+00:00\",\"dateModified\":\"2015-05-14T18:15:00+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server 2008: Partition-level lock escalation details and examples\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\",\"name\":\"Paul S. Randal\",\"description\":\"In Recovery...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\",\"name\":\"Paul Randal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"caption\":\"Paul Randal\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/paul\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SQL Server 2008: Partition-level lock escalation details and examples - Paul S. Randal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/","og_locale":"en_US","og_type":"article","og_title":"SQL Server 2008: Partition-level lock escalation details and examples - Paul S. Randal","og_description":"&nbsp; Back in October 2007 I blogged about partition-level lock escalation in SQL Server 2008 (see here) and I promised to do a follow-up once CTP-5 came out with syntax etc. So here it is. A brief recap &#8211; lock escalation in SQL Server 2005 and before only allowed table-level lock escalation. If you have [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/","og_site_name":"Paul S. Randal","article_published_time":"2008-01-14T22:10:00+00:00","article_modified_time":"2015-05-14T18:15:00+00:00","author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/","name":"SQL Server 2008: Partition-level lock escalation details and examples - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"datePublished":"2008-01-14T22:10:00+00:00","dateModified":"2015-05-14T18:15:00+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/sql-server-2008-partition-level-lock-escalation-details-and-examples\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"SQL Server 2008: Partition-level lock escalation details and examples"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/","name":"Paul S. Randal","description":"In Recovery...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce","name":"Paul Randal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","caption":"Paul Randal"},"sameAs":["http:\/\/3.209.169.194\/blogs\/paul"],"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/1104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/comments?post=1104"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/1104\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=1104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=1104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=1104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}