Today during some discussions with customers, there was a question about some locks being held by a session. Here is an example reproduced below:
begin tran
select * from Person.Person
where LastName = ‘Singh’exec sp_lock @@spid
Here is the output:
spid dbid ObjId IndId Type Resource Mode Status
52 11 0 0 DB S GRANT
52 11 0 0 MD 14(10000:0:0) Sch-S GRANT
52 11 0 0 MD 14(10001:0:0) Sch-S GRANT
52 1 1467152272 0 TAB IS GRANT
52 32767 -571204656 0 TAB Sch-S GRANT
The two rows highlighted in bold in the output were the point of discussion. It was not very apparent as to what those locks were attributed to. So, here is where the power of the newer DMV: sys.dm_os_tran_locks becomes apparent:
select resource_type, resource_subtype, resource_description, request_mode from sys.dm_tran_locks
where request_session_id = @@spid
Here is the output:
resource_type resource_subtype resource_description request_mode
METADATA XML_COLLECTION xml_collection_id = 65536 Sch-S
METADATA XML_COLLECTION xml_collection_id = 65537 Sch-S
Aha! So this made much more sense. So these are metadata locks on XML schema collections. When you look at the Person.Person table, indeed there are two XML columns to which XML schema collections are bound to:
[AdditionalContactInfo] [xml](CONTENT [Person].[AdditionalContactInfoSchemaCollection]) NULL,
[Demographics] [xml](CONTENT [Person].[IndividualSurveySchemaCollection]) NULL,
When you further reconcile the xml_collection_id from the tran_locks DMV, this is sealed:
select xml_collection_id, name from sys.xml_schema_collections
where xml_collection_id in (65536, 65537)
Here is the output:
xml_collection_id name
65536 AdditionalContactInfoSchemaCollection
65537 IndividualSurveySchemaCollection
So, what other types of resources can we expect in the sys.dm_os_tran_locks DMV? If you do some poking around in my favorite catalog view sys.dm_xe_map_values, you will find the answer:
select map_value from sys.dm_xe_map_values
where name = ‘lock_resource_type’
order by map_key
Here is the output:
UNKNOWN_LOCK_RESOURCE
NULL_RESOURCE
DATABASE
FILE
UNUSED1
OBJECT
PAGE
KEY
EXTENT
RID
APPLICATION
METADATA
HOBT
ALLOCATION_UNIT
OIB
ROWGROUP
LAST_RESOURCE
Note: the above output was produced from a SQL 2014 instance, so you may not find all the values in older versions of SQL. Most of the above are easy to understand (for example, Object, Page or Key.)
NOW – there are some others in the above list which are not that easily understood. If you want to hear more, please leave a comment and indicate what exactly you want to know more about! I’ll do my best to explain within the boundaries of what we can share publicly