Управляемые блокировки. Конфликт блокировок при блокировках по разным полям. #759691


#0 by snowmanual
Вечер добрый! Наткнулся на следующую проблему. Одновременно выполняется 2 сеанса. Оба устанавливают управляемые блокировки по одному регистру сведений, но по разным полям, по конкретному значению. При этом один сеанс блокирует другой, хотя по логике этого быть не должно. Кто знает в чём дело? Пример кода сеанса 1. НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); Пример кода сеанса 2. НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
#1 by snowmanual
Версия платформы 8.3.6. СУБД SQL.
#2 by ptiz
Дело в твоем понимании работы блокировок. У тебя в записях с Измерение1="1" встречаются такие, где Измерение2 = "2"
#3 by snowmanual
Нет, проверял. Данные не пересекаются.
#4 by Cyberhawk
Может, транзакция открывается внутри другой транзакции (в т.ч. неявной), у которой режим блокировки автоматический?
#5 by Гёдза
Я бы не был так уверен
#6 by Cyberhawk
Ну и у свойства конфигурации "Режим управления блокировкой данных" выбрано какое значение&
#7 by snowmanual
Нет, вложенных нет. Выполняется только код указанный выше. Конфигурация полностью на управляемом режиме. Автоматического нет.
#8 by snowmanual
Свойство установлено в Управляемый
#9 by snowmanual
Попробуйте на пустом регистре.Я думаю управляемые блокировки не оперируют конкретными данными. При установке блокировки проверяются, уже существующие и если они пересекаются, то вызывается ожидание. Но что делать когда заранее нельзя определить пересекаются они или нет? Так блокировка ставиться по разным полям.
#10 by Гёдза
а что на пустом регистре?
#11 by Гёдза
мне кажется блокировка по измерению1 = 1, блокирует по данному измерению и ПО ВСЕМ другим измерениям
#12 by scanduta
Измерение 2 проиндексировано?
#13 by snowmanual
Оба проиндексированы.
#14 by snowmanual
Возможно вы правы. Я тоже об этом думаю. Но в документации ничего подобного не встречал.
#15 by ЧеловекДуши
На каком наборе данных тестировали? Измерение1 и Измерение2 Как разные Измерения одного и того же регистра. Почему вы так уверены, что при блокировки "Измерение1", то что вы не содержите значения по "Измерение2". Больше склонен думать, что все же дело в отражена суть. И в дан правильный ответ. И логичный. Нам тут трудно видеть, что у вас там на заведено :)
#16 by snowmanual
В частности на пустом наборе данных тестировал.
#17 by Cyberhawk
Я думаю, происходит эскалация блокировки, т.к. диапазон записей, которые попадают в блокировку при блокировании по одному измерению, приближается к общему кол-ву записей в таблице. В ТЖ, к сожалению, событие эксалации не пишется... Для эксперимента попробуй накидать в регистр много больше записей с измерениями "3" и "4" и проверь опять взаимоблокировку на "1" и "2"
#18 by snowmanual
Эскалация происходит не из-за большого кол-ва записей в таблице, а из-за количества самих блокировок на одно пространство. Цитата с документации: "Следует помнить, что если на одно пространство накладывается более 100 000 блокировок, то может произойти эскалация блокировки."
#19 by Гёдза
Упр блокировки не смотрят на индекс
#20 by Cyberhawk
А, точно, попутал с ситуацией, когда записываются много записей в транзакции через менеджер записи - тогда там для каждой записи менеджера записей будет добавляться неявный элемент блокировки
#21 by snowmanual
Делаю вывод, о том как работают управляемые блокировки: 1) Управляемые блокировки не оперируют данными СУБД. Представьте, если бы в таблице были бы миллионы записей. Сколько бы времени уходило на установку блокировки. Даже если поля были бы проиндексированы. 2) При установке управляемой блокировки, в памяти какого-нибудь менеджера кластера сохраняются параметры этой самой блокировки. При этом проверяется, не установлена ли уже блокировка пересекающаяся с указанным диапазоном. Если установлена, то блокировка встаёт в очередь и ждёт. 3) Когда устанавливаются управляемые блокировки по различным полям, сервер не в состоянии однозначно определить, пересекаются они или нет, поэтому исходит из позиции, что они могут пересекаться. И соответственно ставит нашу блокировку в очередь.
#22 by snowmanual
Значит при проектировании системы, необходимо более детально устанавливать блокировки. Возможно вводить какие-нибудь ключевые измерения... Например есть 3 измерения: Изм1, Изм2, Изм3. Можно блокировать диапазон по Изм1. Если хотим по Изм2, то обязательно устанавливаем еще и Изм1. А если хотим еще и Изм3, то дополнительно указываем Изм1, Изм2.
#23 by ЧеловекДуши
Чет ваши выводы не утешительны... Сдается мне, что не стоит пренебрегать измерениями... ...Если лочите первое, то и лочте его везде :)
#24 by snowmanual
Думаю тему можно считать закрытой, если никто не хочет больше ничего добавить =)
#25 by ЧеловекДуши
Детализация тут ни при чем. Главное повторять блокировки :)
#26 by snowmanual
Ну если бы я придумывал эти управляемые блокировки, то  сделал бы так. =)
#27 by ЧеловекДуши
Все ровно спасибо... Приму во внимание :)
#28 by Мэс33
А для MS SQL актуальны ли управляемые блокировки? Я с ними манался при работе с Oracle. Там блокировка на уровне таблиц.
#29 by snowmanual
Да, дело не в детализации. Возможно надо было по другому выразиться. Пример с 3 измерениями лучше объясняет то , что я имел ввиду)
#30 by snowmanual
Актуальны, в случае когда нужна согласованность данных при одновременной работе пользователей.
#31 by Мэс33
Ахха... освежил свои знания насчет READ COMMITED, REPEATABLE READ и SERIALIZABLE . Сорри.
#32 by snowmanual
Например Васе и Пете нужно положить яблоко в коробку, а в коробке место только под одно яблоко =) Нужно блокировать эту коробку, чтобы одновременно они туда свои яблоки не положили =)
#33 by snowmanual
Щас у нас уже READ COMMITED SNAPSHOT. Благая вещь =)
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С