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

Откуда: Киев
Сообщений: 98
День добрый!

Меня волнует вопрос на который не могу найти однозначный ответ (даже после прочтения этого — https://www.sql.ru/articles/mssql/2004/04110303advancedlocking.shtml ), а именно: блокируется ли таблица целиком при выполнении комманд INSERT или UPDATE?

Т.е., например, если я выполняю простейшую операцию вставки или обновления данных:

insert into SomeTable values(@value1, @value2, @value3);
update SomeTable set field1 = @value1 where id = @id;


Будет ли в процессе выполнения этих комманд таблица заблокирована целиком? — т.е., прийдётся ли другому приложению(сервису) ждать пока выполнятся эти комманды, прежде чем он сможет сам, например, произвести операцию выборки — SELECT?

Спасибо.
3 дек 13, 14:00    [15231816]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Еще раз уточню — запросы простейшие: никаких транзакций (TRANSACTION); просто тупые запросы типа INSERT, UPDATE.
3 дек 13, 14:01    [15231826]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
roman_lenko
а именно: блокируется ли таблица целиком при выполнении комманд INSERT или UPDATE?

Вы точно читали статью ?

" Результат SP_LOCK с нужными строками и столбцами показан ниже:
54 6 95686767 TAB IX GRANT
"
это не отвечает на ваш вопрос ?
3 дек 13, 14:03    [15231857]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
roman_lenko
Будет ли в процессе выполнения этих комманд таблица заблокирована целиком? — т.е., прийдётся ли другому приложению(сервису) ждать пока выполнятся эти комманды, прежде чем он сможет сам, например, произвести операцию выборки — SELECT?

Вы определенно не читали статью
" Сейчас мы изменим значение RegionDescription у одной из строк при помощи простой команды update, как показано ниже:

Чтобы выполнить этот запрос, SQL Server не может использовать индекс - индекс не покрывает столбец RegionDescription. Поэтому SQL Server использует полное сканирование таблицы, чтобы найти строку, требующую изменения. Когда он находит эту строку, он превращает update блокировку этой строки в эксклюзивную блокировку. Чтобы убедиться в этом, запустите SP_LOCK в другом окне Query Analyzer. Вы должны увидеть эксклюзивную RID блокировку на соответствующем объекте. В том же окне, в котором вы запустили SP_LOCK, вы можете выполнить следующий select:

Если только вы не указали READPAST или не установили уровень изоляции транзакции как read uncommitted, то вы будете ждать, пока первое соединение не снимет блокировку.
Это ожидаемый результат. Но вот где неожиданность:

В этот раз вы ждать не будете. Если вы похожи на меня, то вы любите смотреть на план выполнения, и именно план выполнения объясняет, почему нам не пришлось ждать."
3 дек 13, 14:06    [15231881]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Glory
roman_lenko
а именно: блокируется ли таблица целиком при выполнении комманд INSERT или UPDATE?

Вы точно читали статью ?

" Результат SP_LOCK с нужными строками и столбцами показан ниже:
54 6 95686767 TAB IX GRANT
"
это не отвечает на ваш вопрос ?


Автор статьи указывает на то, что он использует транзакции: «Заметьте, что я открываю транзакцию, но не закрываю ее. Это сделано для удержания блокировок.»

Я же транзакций не использую, поэтому есть подозрение, что моя ситуация намного проще и отличается от описанной в статье.
3 дек 13, 14:07    [15231890]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
roman_lenko
Автор статьи указывает на то, что он использует транзакции: «Заметьте, что я открываю транзакцию, но не закрываю ее. Это сделано для удержания блокировок.»

А вы 3ее предложение цитаты прочитали ? чтобы узнать, для чего автор использовал транзакции ?
3 дек 13, 14:08    [15231906]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
roman_lenko
блокируется ли таблица целиком при выполнении комманд INSERT или UPDATE?
Может блокироваться, а может и не блокироваться.
roman_lenko
никаких транзакций (TRANSACTION)
Любые модификации данных выполняются в транзакции. Хотите вы этого или нет.

Чтобы проверить какие блокировки были наложены и удерживаются, выполните:
begin tran;

insert into SomeTable values(@value1, @value2, @value3);
update SomeTable set field1 = @value1 where id = @id;

exec sp_lock @@spid;

rollback;
3 дек 13, 14:11    [15231934]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Glory
roman_lenko
Автор статьи указывает на то, что он использует транзакции: «Заметьте, что я открываю транзакцию, но не закрываю ее. Это сделано для удержания блокировок.»

А вы 3ее предложение цитаты прочитали ? чтобы узнать, для чего автор использовал транзакции ?


Та я всё, как-бы, прочитал, но некоторые авторы любят усложнять, моделируя сложные ситуации — как, в частности, с этими транзакциями в статье.

Короче, насколько я понимаю, то блокируется только строка, над которой в данный момент выполняется UPDATE. Если команда выборки SELECT выполняется со сканированием всей таблицы (без индекса), то она будет отложена, а если сканирование выполняется по индексу, то не будет — верно? (если выбираем не ту же строку, которую обновляем в данный момент, естественно).

А как насчёт INSERT? — что происходит при INSERT?
3 дек 13, 14:13    [15231954]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
invm
Любые модификации данных выполняются в транзакции. Хотите вы этого или нет.


Интересно.. Хм — я думал, что транзации вызываются принудительно. Вообще, извиняюсь — я работаю с SQL и БД поверхностно — это не моя специализация (а спеца знакомого у меня нет), поэтмоу я «плаваю», но понять технические детали мне хочется и нужно.

За комманду проверки — спасибо. Протестирую её на реальной таблице.
3 дек 13, 14:16    [15231998]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
roman_lenko
Та я всё, как-бы, прочитал, но некоторые авторы любят усложнять, моделируя сложные ситуации — как, в частности, с этими транзакциями в статье.

Да что вы говорите !
Т.е. надо было каким то волшебным образом показать вам список блокировок после того, как эти блокировки успешно закончились ?

roman_lenko
А как насчёт INSERT? — что происходит при INSERT?

Замените в предлженных скриптах UPDATE на INSERT - и сами все узнаете
3 дек 13, 14:17    [15232017]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Glory
Да что вы говорите !
Т.е. надо было каким то волшебным образом показать вам список блокировок после того, как эти блокировки успешно закончились ?


Извиняюсь — если бы я реально шарил, то я бы эту тему не создавал. Я исхожу из тех знаний, которые накопил в процессе работы — иных и больших мне почерпнуть негде. Поэтому, если я уж чего-то не допонимаю, то тут я ничего поделать не могу — приходится вникать вот так «в процессе».

Glory
Замените в предлженных скриптах UPDATE на INSERT - и сами все узнаете


Окей — спасибо. Я думаю, что это достаточно разные операции, т.к., при INSERT добавляется новая строка — тут блокировать нечего.
3 дек 13, 14:23    [15232084]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
roman_lenko
Я думаю, что это достаточно разные операции, т.к., при INSERT добавляется новая строка — тут блокировать нечего.

Для "я работаю с SQL и БД поверхностно — это не моя специализация" вы слишком много придумываете за сервер
Читайте статью - там написано то, что происходит всегда и у всех. И у вас тоже будет происходить

Сообщение было отредактировано: 3 дек 13, 14:28
3 дек 13, 14:28    [15232135]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Glory
Для "я работаю с SQL и БД поверхностно — это не моя специализация" вы слишком много придумываете за сервер
Читайте статью - там написано то, что происходит всегда и у всех. И у вас тоже будет происходить


Ну, а «в двух словах» разве нельзя объяснить? — типа: тыры-пыры, твои запросы просты как три копейки: если поиск не по индексу — вся таблица заблокирована для UPDATE, если INSERT — то тоже что-то там блокируется..

За комманды тестирования спасибо — я из обязательно применю. Просто всегда ищешь максимально быстрый и простой путь понимания. Читать и полдня разбираться с примерами и понимаем того — подходит ли это к моей ситуации — ну, блин — сами понимаете — зачем тогда форум?
3 дек 13, 14:40    [15232278]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
SonyPictures
Member

Откуда:
Сообщений: 55
roman_lenko
зачем тогда форум?


Ну, кхм, здесь все отвечают добровольно и то, что это форум не обязывает давать прямые ответы, все отвечают в мере своего понимания и так как они этого хотят :)
Я в SQL еще очень "зеленый", но судя по ответам , что мне всегда дают ... все отвты ты найдешь в BOL
Вдруг ты там тоже найдешь ответ, хотя конечно я думаю, что заблуждаюсь, ну да ладно.
3 дек 13, 15:01    [15232468]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
roman_lenko
зачем тогда форум?


чтобы подсказать где искать, и что искать

"объясните мне на пальцах статью" зачастую = "напишите две статьи"
3 дек 13, 15:34    [15232799]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
roman_lenko
Ну, а «в двух словах» разве нельзя объяснить? — типа: тыры-пыры, твои запросы просты как три копейки: если поиск не по индексу — вся таблица заблокирована для UPDATE, если INSERT — то тоже что-то там блокируется..

Для этого и написана статья, ссылку на которую вы привели.
Зачем она была написана ?

roman_lenko
Читать и полдня разбираться с примерами и понимаем того — подходит ли это к моей ситуации — ну, блин — сами понимаете — зачем тогда форум?

Правильно. Нужно, чтобы кто-то другой потратил эти полдня. У вас же есть дела и поважнее.
3 дек 13, 16:16    [15233277]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Glory,

та ну нет же: статья — это сухой текст, а люди на форуме — это реальные, знающие профессионалы, которые разбирают конкретно твою ситуацию. Если бы статьями всё ограничивалось, то интернет состоял бы только из текста и картинок.

Как бы там ни было, я считаю, что опыт работы с SQL у меня есть и мышление выстроено правильно, но мне реально непонятно в этой статье — или она применима к моему вопросу на 100% — поэтому я решил на форуме спросить.
3 дек 13, 16:24    [15233355]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблиц при INSERT, UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
roman_lenko
та ну нет же: статья — это сухой текст, а люди на форуме — это реальные, знающие профессионалы, которые разбирают конкретно твою ситуацию.

Они и написали эту статью.
Для того, чтобы в ней собрать ответы на все вопросы.
Если вам не с кем поговорить, то пойдите на курсы что ли.


roman_lenko
Как бы там ни было, я считаю, что опыт работы с SQL у меня есть и мышление выстроено правильно,

Фантазия у вас развита сильно
3 дек 13, 16:27    [15233386]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить