Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Удаление строки в таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ZaloJNik
Maxx,

значение чего совпадают?

кластерного индекса.. если он есть :)
23 сен 14, 16:12    [16611245]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
ZaloJNik
Member

Откуда:
Сообщений: 50
WarAnt,

Не вопрос.
есть таблица Test с двумя столбцами col1 int, col2 nvarchar(50)
таблица наполняется данными, по полю col1 есть кластерный индекс
потом делаю:

begin tran
delete from test where col1 = 100

после чего запускаю:
SELECT *
FROM test
where col1<>100
в результате получаю набор строк
23 сен 14, 16:17    [16611274]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
ZaloJNik
Member

Откуда:
Сообщений: 50
Maxx,

нет, в ключевом поле все значения разные.
23 сен 14, 16:18    [16611282]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ZaloJNik
Maxx,

нет, в ключевом поле все значения разные.

я пойняв - вы знатный тролль
Что мешает в условии where - указать значение ключевого поля то ?
23 сен 14, 16:22    [16611315]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
ZaloJNik
Member

Откуда:
Сообщений: 50
Maxx,
Прикольно у вас тут, спрашиваешь совета, думаешь, что могут подсказать, а тебя еще и троллем называют.
23 сен 14, 16:29    [16611359]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZaloJNik
спрашиваешь совета

Если вы нашли какое-то несответствие документированному поведению сервера, тт потрудитесь привести полное репро.
Никто не должен за вас догадываться, что, как и на какой версии вы запускали.
23 сен 14, 16:33    [16611374]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
ZaloJNik
Member

Откуда:
Сообщений: 50
Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
Oct 19 2012 13:38:57
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


запрос который использовал, написал выше.
23 сен 14, 16:35    [16611394]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZaloJNik
запрос который использовал, написал выше.

Он падает, потому что нет таблицы.
23 сен 14, 16:37    [16611407]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
o-o
Guest
ZaloJNik
запрос который использовал, написал выше.


--потом делаю:

begin tran
delete from test where col1 = 100

--после чего запускаю:
SELECT *
FROM test
where col1<>100

не сочтите за издевательство, но это случаем не в одной транзакции происходит?
а то как написано, можно и так подумать (еще раз извините)
23 сен 14, 16:59    [16611581]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
ZaloJNik
Member

Откуда:
Сообщений: 50
o-o,
Нет нет, в разных транзакциях.
23 сен 14, 17:11    [16611672]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
o-o
Guest
попробую на 2012 через 3-4 часа, отпишусь.
на 2008 R2 у меня не воспроизводится
23 сен 14, 17:19    [16611739]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Не дождался тестов провел сам.

В итоге результат следущий:

при удалении из таблицы по кластерному индексу

create table t (id int primary key)

insert t select 1 union select 2

begin tran
 delete t where id = 1

--rollback tran


возникают блокировки

spiddbnameobjnametypecountmodestatus
52 master t KEY 1 X GRANT
52 master t PAG 1 IX GRANT
52 master t TAB 1 IX GRANT


Поэтому если во втором коннекте выполнить запрос
select * from t where id <> 1

Он конечно выполнится, так как на таблицу повешена не сама (X) блокировка, а только запрос (IX) на эту блокировку.
А блокировка (X) повешена на ключ.
Но тут я бы не сказал что это косяк документации, можно двояко рассматривать блокировку IX собственно как напрямую относящуюся к блокировке X.
23 сен 14, 17:22    [16611758]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
забыл совсем
проводил на сервере

Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (Intel X86)
Dec 28 2012 19:06:41
Copyright (c) Microsoft Corporation
Standard Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)

и да неправильно высказался,
не запрос на монопольную блокировку,
а Блокировка с намерением монопольного доступа (см. MSDN)
23 сен 14, 17:24    [16611775]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
ZaloJNik
Member

Откуда:
Сообщений: 50
WarAnt,

Спасибо большое, увидел тоже самое у себя.
Конечно можно притянуть, что они имели ввиду и IX, но могли бы они тогда в msdn хоть более развернуто написать, а то вводят в заблуждение.
23 сен 14, 17:34    [16611837]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
ZaloJNik
WarAnt,

Спасибо большое, увидел тоже самое у себя.
Конечно можно притянуть, что они имели ввиду и IX, но могли бы они тогда в msdn хоть более развернуто написать, а то вводят в заблуждение.


Все мы не совершенны:)
23 сен 14, 17:48    [16611917]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
o-o
Guest
Granted Mode

Requested Mode IS S U IX SIX X
Intent shared (IS) Yes Yes Yes Yes Yes No
Shared (S) Yes Yes Yes No No No


Granted Mode IX - Requested Mode Shared (S) = No
у меня висит:

К сообщению приложен файл. Размер - 71Kb
23 сен 14, 17:54    [16611942]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
o-o,

похоже разница между версиями сиквела в типе накладываемых блокировок на страницу,
на 2008 (S) на 2012 (IS)


resource_type resource_description request_mode request_type request_status
KEY(8194443284a0)XLOCKGRANT
KEY(8194443284a0)RangeS-SLOCKWAIT
PAGE1:324ISLOCKGRANT
PAGE1:324IXLOCKGRANT
OBJECTISLOCKGRANT
OBJECTIXLOCKGRANT


эксперимент конечно не совсем чистый пришлось использовать хинт чтобы увидеть блокировки select, но я думаю картинка не сильно поменяется без хинта.
23 сен 14, 18:30    [16612151]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
o-o,

Ваш запрос висит на ожидании, потому что сервер выбрал сканирование с блокировкой страниц.
Поставьте хинт rowlock и ожидания не будет.
23 сен 14, 21:27    [16612789]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
o-o
Guest
invm
o-o,
Поставьте хинт rowlock и ожидания не будет.

так я же воспроизвожу ситуацию ТС
ZaloJNik
...значит я ничего выбрать с таблицы не могу во время удаления(если хинты не использовать), но по факту, если индекс есть, то все прекрасно выбирается, кроме значения которое удаляется...
23 сен 14, 22:00    [16612937]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
o-o
так я же воспроизвожу ситуацию ТС
При кластерном индексе в плане вашего запроса будет Clustered Index Seek с предикатами col1 < 100 и col1 > 100.
Соответственно, если сервер выбрал блокирование на уровне страниц - запрос повиснет. Если на уровне строк - нет.
У вас первый вариант, у ТС - второй.
Можете либо воспользоваться хинтом, либо уменьшить количество строк в таблице.
23 сен 14, 22:32    [16613057]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
o-o
Guest
ок про блокирование на уровне страниц.
у меня действительно строк не 2, а 1 млн.
но вообще в 2012 абсолютно та же картина

К сообщению приложен файл. Размер - 33Kb
24 сен 14, 01:11    [16613525]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
o-o
но вообще в 2012 абсолютно та же картина
А почему должна быть другая?
24 сен 14, 11:03    [16614456]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
o-o
Guest
а кто сказал, что должна :)
было выдвинуто предположение
WarAnt
похоже разница между версиями сиквела в типе накладываемых блокировок на страницу,
на 2008 (S) на 2012 (IS)

ну и разобрались, что не в версии дело, а в объеме данных
24 сен 14, 11:22    [16614616]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
o-o
было выдвинуто предположение
Предположение неверное. Блокировки намерения предназначены для других целей и не могут заменять обычные.
24 сен 14, 11:51    [16614816]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строки в таблице  [new]
o-o
Guest
invm
Блокировки намерения предназначены для других целей и не могут заменять обычные.

ну а ТС не про это что ли?
вся заварушка началась из-за того, что они для версий >= 2012 переписали статью про DELETE.
вписав Locking Behavior:
By default, a DELETE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes.
и для тех, кто сомневается, что такое X, уточнили:
With an exclusive (X) lock, no other transactions can modify data; read operations can take place only with the use of the NOLOCK hint or read uncommitted isolation level.

ТС пишет, что у него спокойно читается в соседней сессии без всяких хинтов до завершения удаляющей транзакции.
уточняет про кластерный индекс. его обзывают троллем
я хочу заступиться, в этом случае никакой Х на всю таблицу не вешается, и именно что IX <> X
только у меня чтение как назло "висит" все равно, ибо строк много и читатель затребовал S на СТРАНИЦУ (лечим через rowlock, спсб)
в общем, мой случай только внес путаницу.

а статья криво написана по-любому, лучше бы и не трогали,
а то можно подумать, в 2012 и 2014 что-то в блокировках поменялось
24 сен 14, 13:18    [16615528]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить