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

Хочу детальнее понять то, как происходит запрос SELECT.
Вот, допустим, выполняеся некоторый запрос:

SELECT A.A + B.B A1, A.A * B.B A2
FROM A ...
LEFT JOIN B ...
RIGHT JOIN C ...
INNER JOIN D ...
OUTER JOIN E ...
WHERE
...


Уровень изоляции - read commited.

Правильно ли я понимаю, что в самом начале выполнения этого запроса будут заблокированы (для записи, т.е. в режиме S) все строки таблиц A, B, C, D и
E, которые будут учавствовать в выборке, и блокировка не снимется до тех пор, пока запрос не выполнится? Судя по описанию, должно быть так. Однако во время выполнения запроса SELECT у меня получается запустить в management studio параллельный запрос UPDATE к этим же таблицам. И этот UPDATE не блокируется и завершается раньше SELECT, хотя итоговая выборка в SELECT и не содержит полей, измененных в UPDATE.

Спасибо!
1 дек 14, 16:27    [16932310]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
Glory
Member

Откуда:
Сообщений: 104751
Все события начала и конца блокировки можно увидетьв трассе/Профайлере
Тогда не придется ничего додумывать
1 дек 14, 16:29    [16932327]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
Crimean
Member

Откуда:
Сообщений: 13147
SQL-2014,

вы ОЧЕНЬ не правы. в read committed блокировки нее будут жить до конца стейтмента
даже если RCSI для базы не включен. а уж если он включен - их вообще не возникнет
хотите, чтобы ваши SHARED держались до конца - ставьте HOLD
а начните с чтения, как работают блокировки :)
1 дек 14, 16:33    [16932362]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
SQL-2014
Guest
Возможны ли такие ситуации?
1. Сначала вычисляется A1 со старыми значениям A.A и B.B. Потом выполняется update таблиц A и B. И только потом вычисляется A2 с новыми значениями A.A и B.B.
2. Если таблица B содержит только одну строку и где-то в середине SELECT произошел update этой строки, то первую половину результата SELECT будет использоваться старое значение B.B, а вторую - новое?

автор
а начните с чтения, как работают блокировки :)

Где про это можно почитать? Желательно подоходчивее.

В msdn для MS SQL 2005 написано:
автор
Данные могут быть изменены другими транзакциями между отдельными инструкциями в текущей транзакции, результатом чего будет неповторяющееся считывание или фиктивные данные.

Разве SELECT - не отдельная инструкция, и данные могут быть изменены пока она выполняется?
1 дек 14, 16:57    [16932571]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
SQL-2014
Guest
автор
Данные могут быть изменены другими транзакциями между отдельными инструкциями в текущей транзакции, результатом чего будет неповторяющееся считывание или фиктивные данные.

Это написано для read committed: http://msdn.microsoft.com/ru-ru/library/ms173763(v=sql.90).aspx
1 дек 14, 16:59    [16932589]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
Glory
Member

Откуда:
Сообщений: 104751
SQL-2014
Разве SELECT - не отдельная инструкция, и данные могут быть изменены пока она выполняется?

А где написано, что
SELECT должен блокировать все объекты сразу при старте
SELECT должен удерживать блокировки до полного окончания запроса
1 дек 14, 17:00    [16932594]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8821
Ему важно блокировать только при чтении из страницы, прочитанные зачем держать?
1 дек 14, 17:09    [16932672]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
SQL-2014
Возможны ли такие ситуации?
1. Сначала вычисляется A1 со старыми значениям A.A и B.B. Потом выполняется update таблиц A и B. И только потом вычисляется A2 с новыми значениями A.A и B.B.
2. Если таблица B содержит только одну строку и где-то в середине SELECT произошел update этой строки, то первую половину результата SELECT будет использоваться старое значение B.B, а вторую - новое?
Фантазер однако.
2 дек 14, 00:26    [16934686]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
SQL-2014
Guest
Mind
SQL-2014
Возможны ли такие ситуации?
1. Сначала вычисляется A1 со старыми значениям A.A и B.B. Потом выполняется update таблиц A и B. И только потом вычисляется A2 с новыми значениями A.A и B.B.
2. Если таблица B содержит только одну строку и где-то в середине SELECT произошел update этой строки, то первую половину результата SELECT будет использоваться старое значение B.B, а вторую - новое?
Фантазер однако.


Я просто под конец рабочего дня по предыдущим ответам подумал, что блокировки на SELECT вообще не ставятся :)

Значит, перечисленные мною ситуации невозможны, и SQL-сервер сам все разрулит, я правильно понял? А то уж собрался делать высший уровень изоляции и блокировать таблицы вручную.

P.S. вопрос про хорошую статью/серию статей про блокировки остается в силе.
2 дек 14, 08:54    [16935138]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка в SELECT  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
SQL-2014
Возможны ли такие ситуации?
1. Сначала вычисляется A1 со старыми значениям A.A и B.B. Потом выполняется update таблиц A и B. И только потом вычисляется A2 с новыми значениями A.A и B.B.
2. Если таблица B содержит только одну строку и где-то в середине SELECT произошел update этой строки, то первую половину результата SELECT будет использоваться старое значение B.B, а вторую - новое?
1. Нет.
2. Возможно, если TIL читателя младше Repeatable Read.
2 дек 14, 10:44    [16935611]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить