有了由脚本 [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
1)之后
--2)after launching 1)
select * from aaa --deleted comments
where id<>1
--is blocked
独立于 1) 窗口中的事务隔离级别,2) 中的 SELECT 被阻塞。
为什么?
UPDATE 的隔离级别对其他事务的语句有影响吗?
最高隔离级别是 2) 中默认的 READ COMMITTED。
不归属范围锁,SELECT 应该遭受 COMMITTED READS (NONREPEATABLE READs) 和 PHANTOM READS (Repeatable 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'
[2]单击http://en.wikipedia.org/wiki/Isolation_(database_systems )
后复制&粘贴或添加尾随)
更新:
SELECT WITH(NOLOCK) 未被阻止...
更新2:
或与,有什么相同,阅读未提交
请注意,UPDATE 与 SELECT 行不同。
即使在相同的情况下,这种行为也与隔离级别的描述相矛盾 [2]
要点是:
- 假设我不知道还有谁将从同一个(UPDATE-d)表中选择,但与更新行无关
- 了解隔离级别 [2]
SQL Server 2008 R2 开发