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

Откуда:
Сообщений: 244
Речь об ms sql server 2008 r2.
Вопрос в следующем:
Если я использую select-выборку "with no lock" (uncommited read) в одной транзакции. А в это время другая транзакция updat-ом изменяет пару полей этой записи. Я могу в первой транзакции получить эту запись, у которой:
одно поле со старым значением, а второе с новым (измененным update) ?
Пример:

До выполнения транзакция была одна запись:
таблица tab, поля: a = 1, b = 1

Одна транзакция
select a, b from tab with no lock

Вторая транзакция в это время:
update tab set a = a+10, b = b + 10

так вот вопрос, могу ли я при выборке получить, что 'a' = 11, 'b' = 1 ? Или запись изменяется целиком не смотря на with no lock?
Или движок MS SQL доступ к записям держит как атомарную вещь?
13 авг 12, 11:18    [13002757]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
super-code
могу ли я при выборке получить, что 'a' = 11, 'b' = 1 ? Или запись изменяется целиком не смотря на with no lock?
Или движок MS SQL доступ к записям держит как атомарную вещь?
ИМХО запись изменяется целиком.
13 авг 12, 11:27    [13002806]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
super-code
Member

Откуда:
Сообщений: 244
alexeyvg,
ИМХО у меня такое же, но хотелось бы точного ответа. В msdn не получилось найти пока, может туплю и кто-то даст правильную ссылку.
13 авг 12, 11:43    [13002935]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37061
При модификации записи на страницу накладывается латч, так что частично измененную строку вы видеть не должны.
13 авг 12, 12:29    [13003199]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
super-code
Member

Откуда:
Сообщений: 244
Гавриленко Сергей Алексеевич, на страницу накладывается, но я читаю with nolock и могу прочитать эти данные или нет?
13 авг 12, 12:30    [13003207]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37061
super-code
Гавриленко Сергей Алексеевич, на страницу накладывается, но я читаю with nolock и могу прочитать эти данные или нет?
Латчи не имеют отношения к блокировкам и накладываются как раз для того, чтобы пока один поток меняет страницу, другой не мог ее читать.
13 авг 12, 12:36    [13003237]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
super-code
Member

Откуда:
Сообщений: 244
Гавриленко Сергей Алексеевич, большое спасибо, это и нужно было знать.
Тогда ещё вопрос:)
При select with nolock я могу получить одну и ту же запись два раза при каких нибудь условиях? Например, sql server решил переместить страницу где лежала уже выбранная запись, и после перемещения мой запрос второй раз увидел эту запись.
13 авг 12, 12:47    [13003309]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37061
super-code
Гавриленко Сергей Алексеевич, большое спасибо, это и нужно было знать.
Тогда ещё вопрос:)
При select with nolock я могу получить одну и ту же запись два раза при каких нибудь условиях? Например, sql server решил переместить страницу где лежала уже выбранная запись, и после перемещения мой запрос второй раз увидел эту запись.
При select nolock вы можете получить много разных спецэффектов, в том числе и этот, если мне не изменяет память. Пользуйте snapshot isolation level.
13 авг 12, 12:48    [13003320]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
super-code
Member

Откуда:
Сообщений: 244
Итак итог:

При select with nolock:
1. Нельзя получить частично измененную запись;
2. Можно получить записи, которые другая транзакция ещё не применила;
3. Можно получить дважды одну и ту же запись (под вопросом).


Кто что может добавить, прошу...
13 авг 12, 12:55    [13003381]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
super-code
Кто что может добавить, прошу...

http://t-sql.ru/post/nolock.aspx
13 авг 12, 13:00    [13003420]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
super-code
Member

Откуда:
Сообщений: 244
Knyazev Alexey,
спасибо можно получить дважды одну и ту же запись... Вообще интересная статья - рекомендую всем. Особенно про стандартный уровень изобялции, не ожидал...
13 авг 12, 13:11    [13003503]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Гавриленко Сергей Алексеевич
При модификации записи на страницу накладывается латч, так что частично измененную строку вы видеть не должны.
А если страница Extended (LOB)?
13 авг 12, 13:23    [13003579]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37061
Mnior
Гавриленко Сергей Алексеевич
При модификации записи на страницу накладывается латч, так что частично измененную строку вы видеть не должны.
А если страница Extended (LOB)?
Ну, надо как-то проверять. По идее, достаточно латчить первую страницу.
13 авг 12, 13:31    [13003639]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
index seek + key lookup
Guest
super-code
При select with nolock:
1. Нельзя получить частично измененную запись;


если для получения данных используются разные объекты (например index seek + key lookup), то можете.
13 авг 12, 14:11    [13003916]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
index seek + key lookup
Guest
index seek + key lookup
super-code
При select with nolock:
1. Нельзя получить частично измененную запись;


если для получения данных используются разные объекты (например index seek + key lookup), то можете.



вот простой примерчик


подготавливаем данные
create table t1(
	id int identity(1,1) primary key not null 
	, a int not null
	, b int not null
)

create index a on t1(a)




insert t1 (a, b)
select top 50 1,2
from sys.objects
union all
select top 50 2,1
from sys.objects



в одном коннекте запускаем поиск
while 1=1
	if exists(
		select *
		from t1 with( index(a), nolock)
		where a = 1
			and b = 1 
	) print 'a-a-a'


а в другом меняем местами a и b
while 1=1
	update t1 set 
		a = b
		, b = a
13 авг 12, 14:19    [13003997]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
super-code
Member

Откуда:
Сообщений: 244
index seek + key lookup,
Большое спасибо за пример. Одной строчки не хватило для моего понимания, Вы, как предвидели пост "подробнее, пожалуйста" :)
Классно выходит... Оказывается sql server может быть не только друг, но и в враг в неожиданных местах...
13 авг 12, 14:29    [13004087]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
super-code
... nolock ...
Оказывается sql server может быть не только друг, но и в враг в неожиданных местах...
Да, да. Совершенно в неожиданных местах!!!11
Засуньте два гвоздика в розетку. Узнаете что-то новое.

Или это такой "тонкий" троллинг?
13 авг 12, 15:19    [13004522]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Гавриленко Сергей Алексеевич
Латчи не имеют отношения к блокировкам и накладываются как раз для того, чтобы пока один поток меняет страницу, другой не мог ее читать.
Как я понимаю это делает проц. автоматом (почти) без единой строки программного кода. Не?
И это нужно из-за побочных эффектов при вставке / удалении, изменение ключа: смещение, расцепление, слияние.

С другой стороны имеет отношение. Накладывание локов вроде тоже должно быть с латчем. ;)

KO
13 авг 12, 16:21    [13004940]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37061
Mnior
Гавриленко Сергей Алексеевич
Латчи не имеют отношения к блокировкам и накладываются как раз для того, чтобы пока один поток меняет страницу, другой не мог ее читать.
Как я понимаю это делает проц. автоматом (почти) без единой строки программного кода. Не?
И это нужно из-за побочных эффектов при вставке / удалении, изменение ключа: смещение, расцепление, слияние.

С другой стороны имеет отношение. Накладывание локов вроде тоже должно быть с латчем. ;)

KO
Да вряд ли. Латчи - такие же логические блокировки, просто коротковременные и не очень заметные невооруженным взглядом.

З.Ы. А есть еще SubLatches и SuperLatches. :P
З.Ы.Ы. Прямая ссылка на doc-файл от sqlcat, со всеми типами латчей, их совместимостью и т.п. http://www.microsoft.com/downloads/info.aspx?na=41&srcfamilyid=8692fdbd-2b2c-4bc8-89ca-de7c82c423eb&srcdisplaylang=en&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2fB%2f9%2fE%2fB9EDF2CD-1DBF-4954-B81E-82522880A2DC%2fSQLServerLatchContention.docx
13 авг 12, 16:26    [13004986]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Гавриленко Сергей Алексеевич
З.Ы. А есть еще SubLatches и SuperLatches. :P
Ранен.
Гавриленко Сергей Алексеевич
З.Ы.Ы. Прямая ссылка на doc-файл от sqlcat, со всеми типами латчей, их совместимостью и т.п.
Убит.

Откуда вы всё это берёте?! Об SQLCAT даже не слышал.
Может есть "общепринятый" набор ресурсов куда стоит захаживать/следить/почитывать/искать в первую очередь?
14 авг 12, 09:47    [13007331]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
SQLCAT
Хотя с виду больше "для админов", чем "как там всё внутрях".
14 авг 12, 09:53    [13007349]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37061
Mnior
Откуда вы всё это берёте?! Об SQLCAT даже не слышал.
Дык, собственно: http://sqlcat.com/
Они в Москву иногда приезжают, можно пообщаться, пива попить. Хотя давно их не было видно.

З.ы. У меня в почте есть папочка Useful, там много чего useful, но далеко не все еще читано.
14 авг 12, 10:58    [13007659]     Ответить | Цитировать Сообщить модератору
 Re: По блокировкам подскажите  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Гавриленко Сергей Алексеевич
Mnior
Откуда вы всё это берёте?! Об SQLCAT даже не слышал.
Дык, собственно: http://sqlcat.com/
капитаните
Я к тому что может есть и другие ресурсы инета в стиле MustRead
14 авг 12, 12:26    [13008314]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить