I read that if I use IsolationLevel.ReadUncommitted, the query should not issue any locks. However, when I tested this, I saw the following lock:
>Resource_Type: HOBT
Request_Mode: S (Shared)
What is a HOBT lock? Something related to HBT (Heap or Binary Tree lock)?
Why would I still get a S lock?
How do I avoid shared locking when querying without turning on the isolation level snapshot option?
I am testing this on SQLServer 2008, and the snapshot option is set to off. The query only performs a select.
I can see that Sch-S is required, although SQL Server seems not to be showing it in my lock query. How come it still issues a Shared Lock? According to:
[SET TRANSACTION ISOLATION LEVEL (Transact-SQL)][1]
>Transactions running at the `READ UNCOMMITTED` level do not issue shared locks to prevent other transactions from modifying data read by the current transaction.
So I am a little confused.
[1]: http://msdn.microsoft.com/en-us/library/ms173763.aspx
> What is HOBT lock?
[A lock protecting a B-tree (index) or the heap data pages in a table that does not have a clustered index.][1]
> Why would I still get a S lock?
This happens on heaps. Example
SET NOCOUNT ON;
DECLARE @Query nvarchar(max) =
N'DECLARE @C INT;
SELECT @C = COUNT(*) FROM master.dbo.MSreplication_options';
/*Run once so compilation out of the way*/
EXEC(@Query);
DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;
PRINT 'READ UNCOMMITTED';
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@Query);
PRINT 'READ COMMITTED';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
EXEC(@Query);
DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;
### Output `READ UNCOMMITTED`
```none
Process 56 acquiring Sch-S lock on OBJECT: 1:1163151189:0 (class bit0 ref1) result: OK
Process 56 acquiring S lock on HOBT: 1:72057594038910976 [BULK_OPERATION] (class bit0 ref1) result: OK
Process 56 releasing lock on OBJECT: 1:1163151189:0
```
### Output `READ COMMITTED`
```none
Process 56 acquiring IS lock on OBJECT: 1:1163151189:0 (class bit0 ref1) result: OK
Process 56 acquiring IS lock on PAGE: 1:1:169 (class bit0 ref1) result: OK
Process 56 releasing lock on PAGE: 1:1:169
Process 56 releasing lock on OBJECT: 1:1163151189:0
```
According to [this article][2] referencing Paul Randal the reason for taking this `BULK_OPERATION` shared HOBT lock is to prevent reading of unformatted pages.
[1]: https://msdn.microsoft.com/en-us/library/ms189849.aspx
[2]: https://tenbulls.co.uk/2011/10/14/nolock-hits-mythbusters/