How to find what prevented in getting a lock?
I recommend zespri's approach. Use profiler to find the query that is taking an inordinate amount of time. 

If you've somehow had no joy with that, you can try the following query which will show a process with a particularly large waittime value.

It filters out any system processes and SQL which has contains WAITFOR DELAY '00:00:05' ... etc

SELECT * 
FROM master.dbo.sysprocesses 
WHERE spid &gt; 49 
AND (blocked &lt;&gt; 0 OR (waittype &lt;&gt; 0x0000 AND lastwaittype &lt;&gt; 'WAITFOR'))


You can then dig a little deeper with the spid against the row  that looks like it is causing the problem and inspect the SQL code that is running/locking:

DECLARE @Handle varbinary(50), @Spid int = &lt;your spid value/&gt;
SELECT @Handle = sql_handle from master.dbo.sysprocesses where spid = @spid
DBCC INPUTBUFFER (@spid)
SELECT * FROM master.sys.fn_get_sql(@Handle)


And the resulting output will look like this:

EventType      Parameters EventInfo
-------------- ---------- ------------------------------------------------------------
Language Event 0          SELECT GETDATE()

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
dbid   objectid    number encrypted text
------ ----------- ------ --------- ---------------------------------------------------
13     NULL        NULL   0         SELECT GETDATE()


This should help you narrow down the problem query.