Имея таблицу, определенную скриптом [1], я выполняю скрипты в 2-х окнах 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
и после 1)
--2)after launching 1)
select * from aaa --deleted comments
where id<>1
--is blocked
Независимо от уровня изоляции транзакции в 1) окне, SELECT в 2) заблокирован.
Почему?
Влияет ли уровень изоляции для UPDATE на операторы других транзакций?
Наивысший уровень изоляции по умолчанию READ COMMITTED в 2).
Блокировки диапазона не приписываются, SELECT должен был пострадать от проблем COMMITTED READS (НЕПОВТОРИМЫЕ ЧТЕНИЯ) и PHANTOM READS (повторяющиеся чтения) [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).
Обновление:
SELECT WITH (NOLOCK) не заблокирован ...
Update2:
или с, что то же самое, ПРОЧИТАЙТЕ НЕОБХОДИМО
Обратите внимание, что UPDATE находится в строке, отличной от строки SELECT.
Даже если в одной и той же строке, такое поведение противоречит описанию уровней изоляции [2]
Дело в том, что:
- предположим, я не могу знать, кто еще будет ВЫБРАТЬ из той же таблицы (UPDATE-d), но не связан с обновлением строк
- чтобы понять уровни изоляции [2]
SQL Server 2008 R2 Dev