具有表,定义的脚本[1],我执行的脚本中的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

和之后的1)

--2)after launching 1)
select * from aaa --deleted comments
where id<>1
--is blocked

独立事务隔离水平在1)窗口,在选择2)被阻止。
为什么?

不隔离级别为更新有任何影响上发言的其他交易?

最高的隔离水平是默读直致力于在2).
没有范围锁的原因是,选择应该有遭受了致力于读取(不可重复读)和幻读(可重复读)的问题[2]
如何使它痛苦吗?

如何可以更新可在不阻止选择?

[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'  

[2]
复制、粘贴,或加入追踪)在点击
http://en.wikipedia.org/wiki/Isolation_(database_systems)

更新:
选用(NOLOCK)不阻止...

Update2:
或者,这是相同的,未提交读

注意,更新是在不同的选择排。
甚至,如果在相同的,这种行为违背了以描述的隔离水平[2]

要点是:

  • 假设我不知道还有谁会选择从相同(更新的d)表,但在无关的更新行
  • 了解隔离水平[2]

SQL服务器2008年R2Dev

有帮助吗?

解决方案

我相信这是因为你没有一个主要关键,我认为这是导致锁正在升级,因此阻止了选择。如果添加的一个主要关键到ID列,你将注意到如果你再试一次,选择将返回的其他3行,现在没有与(NOLOCK)暗示需要。

其他提示

重复测试后

--3)
create index IX_aaa_ID on aaa(id)

选择2)仍然受阻

--4)
drop index IX_aaa_ID on aaa
create unique index IX_aaa_ID on aaa(id)
--or adding primary key constraint   

选择2)不被阻止的

如果修改2)

--2b)
select * from aaa 
    where id=3 
    --or as
    --WHERE id=2 

表2b)不被阻止的,甚至在没有任何指数或PK。

不过,2b),没有任何索引、被阻止后,修改了1)更新运行在序列化 但是没有根据可重复读或下

--1c)  
set transaction isolation level serializable;
--set transaction isolation level REPEATABLE READ;

begin transaction;
update aaa set Name ='bbb' 
    where id=1;
--rollback

因此,它看起来像个行选择试图获取非共享的锁?

更新:
好吧,在所有情况下的选择被阻止它正在等待获取LCK_M_IS
很好的理由uderstand这美食

Update2:
好吧,这不是更新锁,是不断升级表上,是选择(公共)锁定(在选择试图读取多行)的升级表锁,不能被授予的,因为表已经独家(更新)锁。

和的存在或不存在的索引无关我的主要问题

我转移讨论这个题目向我提交建议 "意图桨架不应该升级为一个表锁,如果表格中已包含的专属锁"

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top