What does it mean when I see a lock in sys.dm_tran_locks and there's no matching row in sys.dm_exec_requests? I'm running this query

select sessions.session_id from
   sys.dm_tran_locks locks inner join  sys.dm_exec_sessions sessions
      on locks.request_session_id=sessions.session_id


and it consistently outputs around four thousand rows. Yet when I run

select session_id from sys.dm_exec_requests


it outputs no more than several rows. And if I try this

select sessions.session_id, requests.session_id
    from sys.dm_tran_locks locks inner join sys.dm_exec_sessions sessions
       on locks.request_session_id=sessions.session_id
       left outer join sys.dm_exec_requests requests
         on sessions.session_id=requests.session_id
order by requests.session_id


I see that none of sessions.session_id are null but notably more than half of requests.session_id are null.

What does that mean? Where do those rows in sys.dm_tran_locks belong than I cannot find a matching row in sys.dm_exec_requests?
Two more additional filters are necessary for your first query.  

1- You need to execute query for user databases only i.e. resource_database_id &gt; 4
and
2- Session status "sleeping" mean, session is currently running no request, so exclude such sessions from your result. i.e. [sessions].status  &lt;&gt;'Sleeping'   

select sessions.session_id,* from
   sys.dm_tran_locks locks inner join  sys.dm_exec_sessions sessions
      on locks.request_session_id=sessions.session_id
WHERE locks.resource_database_id &gt; 4  
AND [sessions].status  &lt;&gt;'Sleeping'