I am attempting to execute long running reads against a table which is also the target of insert bulk queries from sqlbulkcopy. In order to achieve this I have added the with(nolock) to the query shown below:
SELECT MAX([ModifiedDate])
FROM [dbo].[LogEvent] WITH(NOLOCK)
WHERE [CompanyId] = '00000000-0000-0000-0000-000000000000'
AND [UserId] = '00000000-0000-0000-0000-000000000000'
AND [ComponentId] = 64
AND [LogLevel] >= 70
AND [LastUpdate] >= '2016-01-01'
However it seems that when the bulk inserts try to obtains their IX and X exclusive locks they are blocked by the select query and therefore fail.
I believe this is because the LogEvent table is a heap table with no clustered index and therefore even with NoLock a HOBT shared lock is taken out.
Will the HOBT shared (S) lock prevent inserts or does this only apply to lower level locks?
If so could I fix this simply by adding a clustered index?
This is very similar to this question Shared Lock issued on IsolationLevel.ReadUncommitted but I'm looking for an explicit confirmation that this will prevent inserts?
nolockinstead useread uncommitted isolation level. A proper index (if you put your table ddl), we can recommend. – Kin Shah Apr 01 '16 at 19:42