Вопрос

Наличие таблицы, определяемую сценарием [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) окно выбора в 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:
Или с, что то же самое, читайте незарегистрированные

Обратите внимание, что обновление находится в зависимости от Select Row.
Даже если на то же самое, это поведение противоречит описанию уровней изоляции [2

Точки:

  • Предположим, я не могу знать, кто еще собирается выбрать из одного и того же таблицы (Update-d), но на не связанных с установками
  • Чтобы понять уровни изоляции [2

SQL Server 2008 R2 dev

Это было полезно?

Решение

Я верю, что это потому, что у вас нет первичного ключа, который, как я думаю, приведет к обогащению замков, отсюда разблокируя выбор. Если вы добавите первичный ключ в столбцу ID, вы заметите, что если вы попробуете еще раз, выбор вернет остальные 3 строки сейчас - NO с (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) Обновление для запуска под Serializable, но не под повторяемым чтением или ниже

--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
Хорошая причина для удивителя этой кухни

Update2:
Ну, не обновляется блокировку обновления, которая обострилась на столе, он выбрал (общие) блокировки (при выборе пытается прочитать несколько строк) возникают до блокировки таблицы и не могут быть предоставлены, потому что таблица уже исключает замок (обновление).

И наличие или отсутствие индекса было не связано с моим основным вопросом

Я сдвинул обсуждение этой темы к моему представленному предложению «Intent Rowlocks не должны быть направлены на столовую блокировку, если таблица уже содержит эксклюзивный замок»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top