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

Откуда: Луганск, Украина
Сообщений: 41
Здравствуйте!

Подскажите, в чем разница между WITH (XLOCK, TABLOCK), WITH (XLOCK, TABLOCKX) и WITH (TABLOCKX)?

Все варианты хинтов накладывают монопольную блокировку на всю таблицу до окончания транзакции, или все же есть разница?

Спасибо.
9 ноя 09, 18:16    [7904061]     Ответить | Цитировать Сообщить модератору
 Re: Не могу до конца понять действие лок-хинтов  [new]
PokeMan
Member

Откуда: MOSKAU
Сообщений: 312
MSDN

TABLOCK

Указывает, что на таблицу наложена блокировка, которая удерживается до окончания инструкции. При чтении данных накладывается совмещаемая блокировка. При изменении данных накладывается монопольная блокировка. Если при этом указан аргумент HOLDLOCK, совмещаемая блокировка таблицы удерживается до конца транзакции.

При использовании с массовым поставщиком наборов строк OPENROWSET для импорта данных в таблицу без индексов аргумент TABLOCK позволяет нескольким клиентам параллельно загружать данные в целевую таблицу с оптимизацией записи в журнал и блокировки.

TABLOCKX

Указывает, что монопольная блокировка таблицы применяется до конца транзакции.

...

XLOCK

Указывает, что монопольные блокировки применяются и удерживаются до завершения транзакции. Если при этом указан аргумент ROWLOCK, PAGLOCK или TABLOCK, монопольная блокировка применяется к соответствующему уровню гранулярности.

Все четко написано.
Или Вы ищите скрытый смысл?

P.S.: ответ указанных выражений будет разный? :-)
1+2 = ?
1+1+1 = ?
2+1 = ?
9 ноя 09, 18:42    [7904166]     Ответить | Цитировать Сообщить модератору
 Re: Не могу до конца понять действие лок-хинтов  [new]
avb1987
Member

Откуда: Луганск, Украина
Сообщений: 41
PokeMan,

Не то чтобы скрытый смысл, просто хочется понять во всех подробностях как именно это работает. Конечно я читал описания на сайте Microsoft, причем в моем случае они были сформулированы иначе чем в ваших цитатах:



TABLOCK

Указывает, что наложенная на таблицу совмещаемая блокировка удерживается до окончания инструкции. Если при этом указан аргумент HOLDLOCK, совмещаемая блокировка таблицы удерживается до конца транзакции.

Во время импорта данных в кучу с помощью инструкции INSERT INTO <target_table> SELECT <columns> FROM <source_table> можно включить оптимизированное ведение журнала и блокировки для инструкции, указав для целевой таблицы подсказку TABLOCK. Кроме того, для базы данных должна быть задана простая модель восстановления или модель восстановления с неполным протоколированием. Дополнительные сведения см. в разделе Инструкция INSERT (Transact-SQL).

При использовании с поставщиком больших наборов строк OPENROWSET для импорта данных в таблицу подсказка TABLOCK позволяет нескольким клиентам параллельно загружать данные в целевую таблицу с оптимизацией записи в журнал и блокировки. Дополнительные сведения см. в разделе Предварительные условия для минимального ведения журнала массового импорта данных.


TABLOCKX

Указывает, что к таблице применяется монопольная блокировка.


Здесь было непонятно, применяется ли монопольная блокировка таблицы до окончания инструкции или до окончания транзакции?


XLOCK

Указывает, что монопольные блокировки применяются и удерживаются до завершения транзакции. Если при этом указан аргумент ROWLOCK, PAGLOCK или TABLOCK, монопольная блокировка применяется к соответствующему уровню гранулярности.


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


У вас более внятные описания, из которых следует что для установки монопольной блокировки на таблицу до окончания транзакции достаточно только TABLOCKX - это и хотелось узнать. Спасибо.
9 ноя 09, 19:53    [7904355]     Ответить | Цитировать Сообщить модератору
 Re: Не могу до конца понять действие лок-хинтов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
avb1987
Здесь было непонятно, применяется ли монопольная блокировка таблицы до окончания инструкции или до окончания транзакции?

Все блокировки действуют от начала накладывания до конца транзакции.

avb1987
Здесь было непонятно, в случае комбинации XLOCK с TABLOCK, монопольная блокировка таблицы удерживается до конца транзакции только в том случае, когда совмещаемая блокировка переходит в монопольную? (т.к. в TABLOCK сказано что устанавливается совмещаемая блокировка, а об монопольных ни слова), или в этом случае блокировка в любом случае будет монопольной?
Как раз XLOCK переводит TABLOCK в монопольную. Или, скажем, TABLOCK - немонопольная, которая может перейти в монопольную при определённых условиях, а TABLOCKX (или, что то же самое, XLOCK + TABLOCK) - это монопольная изначально, без всяких условий.
10 ноя 09, 09:57    [7905830]     Ответить | Цитировать Сообщить модератору
 Re: Не могу до конца понять действие лок-хинтов  [new]
avb1987
Member

Откуда: Луганск, Украина
Сообщений: 41
alexeyvg,

Ок, большое спасибо за разъяснения.
10 ноя 09, 12:45    [7907171]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Не могу до конца понять действие лок-хинтов  [new]
Dmitryk2
Member

Откуда:
Сообщений: 2
alexeyvg
TABLOCKX (или, что то же самое, XLOCK + TABLOCK)


Осторожно, это заблуждение! По крайней мере для MS SQL.

Если вы выполните SELECT TOP 1 ... WITH (TABLOCK, XLOCK) во множестве потоков -- периодически будет вываливатсья делок. Только один запрос. Хрен знает почему. А вот с TABLOCKX такого не происходит.

Вот что нашел:

автор
This stems from what Dan Guzman noticed. in the case of TABLOCK, XLOCK (or
UPDLOCK), sql server starts by taking a shared table lock, then the
exclusive lock on the table. If both threads manage to take the shared lock,
then they both deadlock waiting for the exclusive (or update lock). The
order of this is very very very wrong, sql server MUST take the most
restrictive lock first to avoid this deadlock. The deadlock can occure as
soon as a select with TABLOCK, XLOCK/UPDLOCK is used from multiple
connections, a transaction isn't even needed.

Thus (TABLOCK, UPDLOCK/XLOCK) should be avoided at all cost with the current
architecture. One must use TABLOCKX instead
. Nothing in BOL mentions this
difference thou.


http://dbaspot.com/ms-sqlserver/140553-transaction-deadlock-tablelocks-2.html

Ребят, очень осторожно с этими вещами. Я целый день убил, нервов кучу потратил.
10 дек 13, 08:45    [15268477]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить