Имя: Пароль:
1C
1С v8
Управляемые блокировки. Конфликт блокировок при блокировках по разным полям.
0 snowmanual
 
02.12.15
12:12
Вечер добрый!

Наткнулся на следующую проблему.
Одновременно выполняется 2 сеанса. Оба устанавливают управляемые блокировки по одному регистру сведений, но по разным полям, по конкретному значению. При этом один сеанс блокирует другой, хотя по логике этого быть не должно. Кто знает в чём дело?

Пример кода сеанса 1.

НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);

блок = Новый БлокировкаДанных;
элблок = блок.Добавить("РегистрСведений.Тест");
элблок.Режим = РежимБлокировкиДанных.Исключительный;
элблок.УстановитьЗначение("Измерение1", "1");

блок.Заблокировать();

Предупреждение("!");

ЗафиксироватьТранзакцию();

Пример кода сеанса 2.

НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);

блок = Новый БлокировкаДанных;
элблок = блок.Добавить("РегистрСведений.Тест");
элблок.Режим = РежимБлокировкиДанных.Исключительный;
элблок.УстановитьЗначение("Измерение2", "2");

блок.Заблокировать();

ЗафиксироватьТранзакцию();
1 snowmanual
 
02.12.15
12:15
Версия платформы 8.3.6. СУБД SQL.
2 ptiz
 
02.12.15
12:16
(0) Дело в твоем понимании работы блокировок.
У тебя в записях с Измерение1="1" встречаются такие, где Измерение2 = "2"
3 snowmanual
 
02.12.15
12:17
(2) Нет, проверял. Данные не пересекаются.
4 Cyberhawk
 
02.12.15
12:26
Может, транзакция открывается внутри другой транзакции (в т.ч. неявной), у которой режим блокировки автоматический?
5 Гёдза
 
02.12.15
12:27
(3) Я бы не был так уверен
6 Cyberhawk
 
02.12.15
12:27
Ну и у свойства конфигурации "Режим управления блокировкой данных" выбрано какое значение&
7 snowmanual
 
02.12.15
12:28
(4) Нет, вложенных нет. Выполняется только код указанный выше. Конфигурация полностью на управляемом режиме. Автоматического нет.
8 snowmanual
 
02.12.15
12:28
(6) Свойство установлено в Управляемый
9 snowmanual
 
02.12.15
12:30
(5) Попробуйте на пустом регистре.Я думаю управляемые блокировки не оперируют конкретными данными. При установке блокировки проверяются, уже существующие и если они пересекаются, то вызывается ожидание.
Но что делать когда заранее нельзя определить пересекаются они или нет? Так блокировка ставиться по разным полям.
10 Гёдза
 
02.12.15
12:35
(9) а что на пустом регистре?
11 Гёдза
 
02.12.15
12:36
мне кажется блокировка по измерению1 = 1, блокирует по данному измерению и ПО ВСЕМ другим измерениям
12 scanduta
 
02.12.15
12:40
(0) Измерение 2 проиндексировано?
13 snowmanual
 
02.12.15
12:40
(12) Оба проиндексированы.
14 snowmanual
 
02.12.15
12:41
(11) Возможно вы правы. Я тоже об этом думаю. Но в документации ничего подобного не встречал.
15 ЧеловекДуши
 
02.12.15
12:52
(0) На каком наборе данных тестировали?
Измерение1 и Измерение2 Как разные Измерения одного и того же регистра.

Почему вы так уверены, что при блокировки "Измерение1", то что вы не содержите значения по "Измерение2".
Больше склонен думать, что все же дело в (11) отражена суть.
И в (2) дан правильный ответ. И логичный.

Нам тут трудно видеть, что у вас там на заведено :)
16 snowmanual
 
02.12.15
12:58
(15) В частности на пустом наборе данных тестировал.
17 Cyberhawk
 
02.12.15
13:07
Я думаю, происходит эскалация блокировки, т.к. диапазон записей, которые попадают в блокировку при блокировании по одному измерению, приближается к общему кол-ву записей в таблице.
В ТЖ, к сожалению, событие эксалации не пишется...
Для эксперимента попробуй накидать в регистр много больше записей с измерениями "3" и "4" и проверь опять взаимоблокировку на "1" и "2"
18 snowmanual
 
02.12.15
13:11
(17) Эскалация происходит не из-за большого кол-ва записей в таблице, а из-за количества самих блокировок на одно пространство.
Цитата с документации: "Следует помнить, что если на одно пространство накладывается более 100 000 блокировок, то может произойти эскалация блокировки."
19 Гёдза
 
02.12.15
13:12
(12) Упр блокировки не смотрят на индекс
20 Cyberhawk
 
02.12.15
13:16
(18) А, точно, попутал с ситуацией, когда записываются много записей в транзакции через менеджер записи - тогда там для каждой записи менеджера записей будет добавляться неявный элемент блокировки
21 snowmanual
 
02.12.15
13:27
Делаю вывод, о том как работают управляемые блокировки:
1) Управляемые блокировки не оперируют данными СУБД. Представьте, если бы в таблице были бы миллионы записей. Сколько бы времени уходило на установку блокировки. Даже если поля были бы проиндексированы.
2) При установке управляемой блокировки, в памяти какого-нибудь менеджера кластера сохраняются параметры этой самой блокировки. При этом проверяется, не установлена ли уже блокировка пересекающаяся с указанным диапазоном. Если установлена, то блокировка встаёт в очередь и ждёт.
3) Когда устанавливаются управляемые блокировки по различным полям, сервер не в состоянии однозначно определить, пересекаются они или нет, поэтому исходит из позиции, что они могут пересекаться. И соответственно ставит нашу блокировку в очередь.
22 snowmanual
 
02.12.15
13:31
Значит при проектировании системы, необходимо более детально устанавливать блокировки.
Возможно вводить какие-нибудь ключевые измерения...
Например есть 3 измерения: Изм1, Изм2, Изм3.
Можно блокировать диапазон по Изм1.
Если хотим по Изм2, то обязательно устанавливаем еще и Изм1.
А если хотим еще и Изм3, то дополнительно указываем Изм1, Изм2.
23 ЧеловекДуши
 
02.12.15
13:33
(21) Чет ваши выводы не утешительны...
Сдается мне, что не стоит пренебрегать измерениями...
...Если лочите первое, то и лочте его везде :)
24 snowmanual
 
02.12.15
13:33
Думаю тему можно считать закрытой, если никто не хочет больше ничего добавить =)
25 ЧеловекДуши
 
02.12.15
13:33
(22) Детализация тут ни при чем. Главное повторять блокировки :)
26 snowmanual
 
02.12.15
13:34
(23) Ну если бы я придумывал эти управляемые блокировки, то  сделал бы так. =)
27 ЧеловекДуши
 
02.12.15
13:34
(26) Все ровно спасибо... Приму во внимание :)
28 Мэс33
 
02.12.15
13:37
А для MS SQL актуальны ли управляемые блокировки?
Я с ними манался при работе с Oracle. Там блокировка на уровне таблиц.
29 snowmanual
 
02.12.15
13:37
(25) Да, дело не в детализации. Возможно надо было по другому выразиться. Пример с 3 измерениями лучше объясняет то , что я имел ввиду)
30 snowmanual
 
02.12.15
13:40
(28) Актуальны, в случае когда нужна согласованность данных при одновременной работе пользователей.
31 Мэс33
 
02.12.15
13:42
(30) Ахха... освежил свои знания насчет READ COMMITED, REPEATABLE READ и SERIALIZABLE . Сорри.
32 snowmanual
 
02.12.15
13:42
(28) Например Васе и Пете нужно положить яблоко в коробку, а в коробке место только под одно яблоко =) Нужно блокировать эту коробку, чтобы одновременно они туда свои яблоки не положили =)
33 snowmanual
 
02.12.15
13:43
(31) Щас у нас уже READ COMMITED SNAPSHOT. Благая вещь =)