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

Откуда:
Сообщений: 52
Привет!

Скажите, пожалуйста, при каком режиме изоляции и в какой момент накладывается U блокировка?
31 авг 13, 23:45    [14780526]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
Гость333
Member

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

При всех уровнях изоляции, кроме SERIALIZABLE.
В момент, когда query processor выбирает для обработки запись из таблицы или индекса.
1 сен 13, 01:03    [14780587]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Raskolnikov, а букварь для кого?
Режимы блокировки

Гость333
При всех уровнях изоляции, кроме SERIALIZABLE
Чё за брехня?
+
USE tempdb;

CREATE TABLE dbo.Test (ID Int PRIMARY KEY, Name SysName);
INSERT	dbo.Test VALUES	(1,'Name');
BEGIN TRAN TTest;

SELECT * FROM dbo.Test WITH (HoldLock, UpdLock) WHERE ID = 1;

SELECT resource_type, request_mode FROM sys.dm_tran_locks L WHERE L.request_owner_id != 0;
ROLLBACK;
DROP TABLE dbo.Test;
1 сен 13, 02:39    [14780629]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
Raskolnikov
Member

Откуда:
Сообщений: 52
Гость333
При всех уровнях изоляции, кроме SERIALIZABLE.
В момент, когда query processor выбирает для обработки запись из таблицы или индекса.

Есть таблица с 2 колонками: ID (uniqueidentifier) и Count (int). Делаю так:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION

UPDATE TestDataBase.dbo.Table_1 SET Count = Count+1 WHERE Id = 'BB439629-FD1A-4682-96D9-EB0B56BBA0BB'

В результате получается Х блокировка

Mnior
а букварь для кого

Конкретно эта страница букваря была прочитана до того, как создалась эта тема. Но я там не вижу, чтоб было написано когда она возникает. Там сказано:
Букварь
Чтобы избежать этой потенциальной взаимоблокировки, применяются блокировки обновления (U)

Но как её применить я там не увидел.
1 сен 13, 13:37    [14780947]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
Raskolnikov
Но как её применить я там не увидел.
А вам и не нужно ничего применять - движок сервера сам знает что и как делать.
Рассмотрим ваш пример. Если нет индекса по ID, то будет сканирование таблицы. Типы и длительность налагаемых блокировок зависят от уровня изоляции и будет происходить примерно следующее.

При TIL младше SERIALIZABLE:
- На строку накладывается U.
- Если строка удовлетворяет предикату в WHERE, U конвертируется в X и данные модифицируются, X остается до конца транзакции. Если не удовлетворяет, U снимается.

При SERIALIZABLE вместо U будет накладываться RangeS-U и безусловно оставаться до конца транзакции, для модифицируемых строк RangeS-U будет коветироваться в RangeX-X.
1 сен 13, 15:49    [14781098]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
автор
RangeS-U
Дошло, нужно выделить RangeS-U перед U, словно между ними разница больше чем между X и S, и логический смысл кардинально переворачивается.

PS: Bazinga
1 сен 13, 16:57    [14781189]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
Raskolnikov
Member

Откуда:
Сообщений: 52
invm, большое спасибо! Вроде понятно стало.
1 сен 13, 17:10    [14781203]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
Exproment
Member

Откуда:
Сообщений: 416
А мне вот кстати интересно. Какие средства необходимо применить для того чтобы своими глазами увидеть ту самую U-блокировку ? Наверное профайлером как-то можно посмотреть ? Очевидно что живут они в общем случае недолго и скриптами их не отловить.

И сразу подобный вопрос - как можно увидеть что твой запрос ожидает снятия конкретной блокировки(той-же U-блокировки например) ?
1 сен 13, 22:47    [14781826]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
Exproment
Какие средства необходимо применить для того чтобы своими глазами увидеть ту самую U-блокировку ?

1. Профайлер или sp_trace*. Категория событий Locks. События Lock:Acquired и Lock:Released
2. 14566598
1 сен 13, 23:27    [14781995]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Mnior
Гость333
При всех уровнях изоляции, кроме SERIALIZABLE
Чё за брехня?

Да, это я перемудрил, имея в виду RangeS-U.
Для уникальных индексов, при выборке по условию равенства, конечно, U-блокировки будут накладываться и при SERIALIZABLE.
Как говорится, "Шарик, ты балбес!"
2 сен 13, 01:11    [14782193]     Ответить | Цитировать Сообщить модератору
 Re: Когда возникает U блокировка?  [new]
Exproment
Member

Откуда:
Сообщений: 416
invm
1. Профайлер или sp_trace*. Категория событий Locks. События Lock:Acquired и Lock:Released
2. 14566598

Спасибо!
2 сен 13, 02:36    [14782270]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить