具有表,由腳本定義的[1],我的SSMS爲什麼更新塊在無關行上選擇?
--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
2個窗口和1之後)
--2)after launching 1)
select * from aaa --deleted comments
where id<>1
--is blocked
執行獨立於在1)窗口的事務隔離級別的腳本,該SELECT in 2)被阻止。
爲什麼?
更新的隔離級別是否對其他事務的語句有任何影響?
最高隔離級別是2)中的默認READ COMMITTED。
沒有範圍鎖定,SELECT應該遭受COMMITTED 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'
[2]
複製&膏或添加後)在點擊
http://en.wikipedia.org/wiki/Isolation_(database_systems)
更新:
SELECT WITH(NOLOCK)不被阻擋.. 。
Update2:
或與,什麼是相同的,請閱讀未提及
請注意,UPDATE與SELECT行不同。
甚至,如果在同一個,這種行爲違背了隔離級別的描述[2]
點在於:
- 想我不知道還有誰將會從相同的選擇(UPDATE -d)表,但對無關的更新行時
- 理解隔離級別[2]
的SQL Server 2008 R2開發
WITH(NOLOCK)塊選擇? – 2010-10-24 20:52:33
你是不是故意用「 - 」提示? – 2010-10-24 20:53:48
如果您使用rowlock更新提示,該怎麼辦? (並假設它沒有升級......) – 2010-10-24 21:20:21