为什么UPDATE会阻止不相关的行上的SELECT?

Gen*_*нин 1 t-sql sql-server transactions nonblocking database-locking

拥有由脚本[1]定义的表,我在SSMS的2个窗口中执行脚本

--1) first in first SSMS window
set transaction isolation level READ UNCOMMITTED;
begin transaction;
update aaa set Name ='bbb' 
    where id=1;
-- results in "(1 row(s) affected)"
--rollback
Run Code Online (Sandbox Code Playgroud)

之后1)

--2)after launching 1)
select * from aaa --deleted comments
where id<>1
--is blocked
Run Code Online (Sandbox Code Playgroud)

独立于1)窗口中的事务隔离级别,2)中的SELECT被阻止.
为什么?

UPDATE的隔离级别是否会对其他事务的语句产生任何影响?

最高隔离级别是2)中的默认READ COMMITTED.
没有范围锁被归因,SELECT应该遭受COMMITTED READS(NONREPEATABLE READs)和PHANTOM READS(可重复读取)问题[2]
如何让它受到影响?

如何在不阻塞SELECT的情况下进行UPDATE?

[1]

CREATE TABLE aaa
(
    Id int IDENTITY(1,1) NOT NULL,
    Name  varchar(13) NOT NULL
)


insert into  aaa(Name) 
   select '111' union all 
   select '222' union all 
   select '333' union all 
   select '444' union all 
   select '555' union all 
   select '666' union all 
   select '777' union all 
   select '888'  
Run Code Online (Sandbox Code Playgroud)

[2]
点击
http://en.wikipedia.org/wiki/Isolation_(database_systems)复制并粘贴或添加尾随)

更新:
SELECT WITH(NOLOCK)未被阻止...

Update2:
或者,与之相同,READ UNCOMMITTED

请注意,UPDATE与SELECT行不同.
即使如果相同,这种行为也与隔离级别的描述相矛盾[2]

要点是:

  • 假设我不知道还有谁从同一个(UPDATE-d)表中进行SELECT,但与更新行无关
  • 了解隔离级别[2]

SQL Server 2008 R2开发

Ada*_*Dev 6

我相信这是因为你没有主键,我认为这会导致锁升级,从而阻塞了SELECT.如果在ID列上添加PRIMARY KEY,您会注意到如果再次尝试,SELECT将立即返回其他3行 - 不需要WITH(NOLOCK)提示.