Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как заблокировать только 1 строку в таблице без индекса?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
Все привет.
Возник вопрос по результатам одного разговора.

Допустим есть обычная таблица куча без индексов. Каким образом можно обратится к одной конкретной строке этой таблицы заблокировав при этом только эту одну искомую строку?

Возможно ли это без индекса по полю условия? Знакомый утверждает что есть один способ.

Заранее спасибо за ответы.
23 янв 17, 14:17    [20135262]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Андрей_Батькович
Каким образом можно обратится к одной конкретной строке этой таблицы заблокировав при этом только эту одну искомую строку?
Никак.
Обратится к конкретной строке в куче, при отсутствии индекса, нельзя, потому что это куча.

При выполнении Table Scan, если используется стратегия блокирования на уровне строк, блокировка будет накладываться на все строки.
Если сканирование идет с предикатом, то со строк, не удовлетворяющих этому предикату, в некоторых случаях блокировка будет сниматься.
В результате создается впечатление, что блокировались только какие-то конкретные строки.
23 янв 17, 14:57    [20135488]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
invm
Обратится к конкретной строке в куче, при отсутствии индекса, нельзя, потому что это куча.
Если индексов нет, но некоторая комбинация полей по факту уникальна, то почему нельзя?
Да, никто не заприщает задвоить строки. Но, к примеру, никто этого просто не сделал...
23 янв 17, 15:00    [20135508]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
iap
Если индексов нет, но некоторая комбинация полей по факту уникальна, то почему нельзя?
Чтобы обратится к конкретной строке в куче нужно знать ее RID.
Каким образом это можно сделать без индекса?
23 янв 17, 15:08    [20135577]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
invm
iap
Если индексов нет, но некоторая комбинация полей по факту уникальна, то почему нельзя?
Чтобы обратится к конкретной строке в куче нужно знать ее RID.
Каким образом это можно сделать без индекса?
Для таблицы без индексов можно построить WHERE?
К примеру, там есть поле с IDENTITY, порядок которого не нарушался,
и известно некоторое значение этого поля.
Почему нельзя обратиться к строке с этим значением вышеупомянутого поля с IDENTITY?
Вроде, индекс тут не при чём?
Гарантии, что такая строка единственная, конечно, нет. Но чаще всего это не помешает в описанных обстоятельствах?
И да, я рассуждаю не как сервер, а как его простой клиент. Про RID, допустим, даже не догадываюсь.
23 янв 17, 16:03    [20135948]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
iap
И да, я рассуждаю не как сервер, а как его простой клиент. Про RID, допустим, даже не догадываюсь.
Насколько я понял, ТС'а интересует именно физика процесса.
23 янв 17, 17:05    [20136367]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
Андрей_Батькович
Member

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

Для того что бы добраться до искомой строки придется делать скан, а это значит что будут блокироваться другие строки.
А мне нужно прочитать только одну строку и блокировать именно ее.
23 янв 17, 17:46    [20136619]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Андрей_Батькович
iap,

Для того что бы добраться до искомой строки придется делать скан, а это значит что будут блокироваться другие строки.
А мне нужно прочитать только одну строку и блокировать именно ее.
Я просто хотел указать на неточность фразы про невозможность обратиться к строке без индекса. Только это.
23 янв 17, 21:26    [20137428]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Андрей_Батькович
Возможно ли это без индекса по полю условия? Знакомый утверждает что есть один способ.
Ну так пусть поведает миру. А мы послушаем.
23 янв 17, 22:45    [20137703]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Андрей_Батькович
iap,

Для того что бы добраться до искомой строки придется делать скан, а это значит что будут блокироваться другие строки.
А мне нужно прочитать только одну строку и блокировать именно ее.
А что тут понимается под "блокировать"? Определённый тип блокировки или любой, на всё время до конца обновления, или любой факт блокировки на любое время?

Можно, скажем, сделать курсор, дойти до нужной строки, потом сделать обновление с условием WHERE CURRENT OF ...
24 янв 17, 02:07    [20137924]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
Андрей_Батькович
Member

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

Под блокировкой можно считать S блокировку при чтении.
24 янв 17, 09:11    [20138128]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Андрей_Батькович
alexeyvg,

Под блокировкой можно считать S блокировку при чтении.


А вы поставьте себя на место SQL, вы мне сказали покажи мне строку где id = 5, я понятия не имею скольок там таких записей и есть ли они вообще, соответственно мне нужно посмотреть всю таблицу, если у меня уровень изоляции по умолчанию я накладываю IS на таблицу и S на страницу которую сейчас читаю, если repeatable read то IS на таблицу и S на страницу которую я прочитал, когда таких страниц становится много увеличиваю ее до S на всю таблицу, если Serializable сразу S на всю таблицу.
И скажите как здесь может блокироватьтся одна строка, минимально блокируется страница.
24 янв 17, 10:17    [20138397]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
aleksrov
И скажите как здесь может блокироватьтся одна строка, минимально блокируется страница.
И почему же нельзя блокировать на уровне строк?
24 янв 17, 10:45    [20138512]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
invm
aleksrov
И скажите как здесь может блокироватьтся одна строка, минимально блокируется страница.
И почему же нельзя блокировать на уровне строк?


Если я ошибаюсь, скажите как он это сделает.
Если говорить про Update то да, SQL сканирует таблицу, находит нужную строку, накладывает на нее X, IX на страницу и таблицу, и сканируем оставшиюся часть таблицы. Здесь да, X на одной строке, если больше строк удолетворяющих условию нет. А если мы про select говорим, я считал процесс происходит так как я описал его выше.
24 янв 17, 11:08    [20138613]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
aleksrov
Если я ошибаюсь, скажите как он это сделает.
Да точно так же, как вы писали, только на уровне строк.
use tempdb;
go

if object_id('dbo.t', 'U') is not null
 drop table dbo.t;
go

select object_id into dbo.t from sys.objects;
go

declare @object_id int = (select top (1) object_id from dbo.t order by newid());
begin tran;
select object_id from dbo.t with (repeatableread) where object_id = @object_id;
exec sp_lock @@spid;
commit;
go

drop table dbo.t;
go
24 янв 17, 11:34    [20138750]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
invm, понятно, спасибо.
24 янв 17, 12:05    [20138974]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
Андрей_Батькович
Все привет.
Возник вопрос по результатам одного разговора.

Допустим есть обычная таблица куча без индексов. Каким образом можно обратится к одной конкретной строке этой таблицы заблокировав при этом только эту одну искомую строку?

Возможно ли это без индекса по полю условия? Знакомый утверждает что есть один способ.

Заранее спасибо за ответы.



Вообще, если начинать с начала, то AFAIR в MS SQLServer вообще нет возможности гарантированно заблокировать только одну строку таблицы. В зависимости от условий работы сервера и конфигурации, СУБД может заблокировать в транзакции как отдельную строку, так и страницу или даже всю таблицу, но у программиста нет возможности этим управлять.

Так что лучше оперировать не в терминах "заблокировать" , а в терминах изоляции транзакций и операций чтения или записи.
28 янв 17, 12:45    [20156344]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
MasterZiv
Вообще, если начинать с начала, то AFAIR в MS SQLServer вообще нет возможности гарантированно заблокировать только одну строку таблицы.
Чо эта? В таблице с одной строкой больше одной не заблокируется.

MasterZiv
В зависимости от условий работы сервера и конфигурации, СУБД может заблокировать в транзакции как отдельную строку, так и страницу или даже всю таблицу, но у программиста нет возможности этим управлять.
Чо это еще раз? Эскалация отключается, индексы можно строить с ALLOW_ROW_LOCKS/ ALLOW_PAGE_LOCKS, гранулярность блокировок хинтами можно в запросе указывать. Это далеко не "у программиста нет возможности этим управлять".
28 янв 17, 15:03    [20156678]     Ответить | Цитировать Сообщить модератору
 Re: Как заблокировать только 1 строку в таблице без индекса?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
а, значит мои сведения устарели. рад за mssql.
29 янв 17, 01:21    [20157920]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить