Sleeping SPID blocking other transactions
Use the most_recent_sql_handle in sys.dm_exec_connections to see the last statement that was executed.
SELECT t.text,
QUOTENAME(OBJECT_SCHEMA_NAME(t.objectid, t.dbid)) + '.'
+ QUOTENAME(OBJECT_NAME(t.objectid, t.dbid)) proc_name,
c.connect_time,
s.last_request_start_time,
s.last_request_end_time,
s.status
FROM sys.dm_exec_connections c
JOIN sys.dm_exec_sessions s
ON c.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t
WHERE c.session_id = 72;--your blocking spid
Also check if there is an open transactions for that spid
SELECT st.transaction_id,
at.name,
at.transaction_begin_time,
at.transaction_state,
at.transaction_status
FROM sys.dm_tran_session_transactions st
JOIN sys.dm_tran_active_transactions at
ON st.transaction_id = at.transaction_id
WHERE st.session_id = 72;--your blocking spid
From comments, I'm guessing you had a client side Command timeout that has aborted the SQL query. This does not rollback the transaction because the connection stays open on SQL Server due to connection pooling.
So, you need to use SET XACT_ABORT ON or add some client rollback code
See SQL Server Transaction Timeout for all the gory details
Have you tried using Adam Machanic's sp_whoisactive? There's an option to get the outer command to see if it really is within a proc. It could be the application is holding open a transaction instead of committing it. Try looking at DBCC OPENTRAN as well.