Сценарий, который заставил меня задуматься, следующий.
Предположим, что мы работаем со справочником «Товары». В Транзакция № 1 мы устанавливаем явную исключительную управляемую блокировку на элемент «Товар 1» по ссылке. В это же время в транзакции № 2 мы пытаемся установить исключительную управляемую блокировку, но по наименованию «Товар 1» и становимся в ожидание.
Вопрос: откуда платформа узнает, что заблокированный элемент в первой транзакции имеет наименование «Товар 1», мы же установили блокировку только по ссылке? Я сделал предположение, что должно быть дополнительное обращение к СУБД. Профайлер таковых не обнаружил. Но ожидание-то есть.
Возникла мысль: а что, если в транзакции № 2 попытаться установить блокировку по другому наименованию, например «Такого названия нет»? Результат –транзакция становится в ожидание.
Таким образом, установка блокировок на разные поля не имеет смысла. В моем примере в транзакции №2 платформа обнаруживает, что в пространстве «Справочник.Товары» установлена блокировка по ссылке, но наименование элемента с такой ссылкой она не знает, поэтому принимает решение не устанавливать блокировку и ставит транзакцию в ожидание.
Кстати, при записи элемента, платформа устанавливает неявную управляемую блокировку как на ссылку, так и на все поля, указанные в свойстве «Поля блокировки данных» (строго в соответствии с документацией). В этом случае, если наименование записываемого элемента не совпадает с наименованием, по которому транзакция № 2 пытается установить блокировку, то конфликта не будет.
Вот выдержка из технологического журнала, отлавливались события «TLOCK».
Блокировка по наименованию:
Regions=Reference9.REFLOCK,
Locks='Reference9.REFLOCK Exclusive Description="Такого названия нет"',
Блокировка по ссылке:
Regions=Reference9.REFLOCK,
Locks='Reference9.REFLOCK Exclusive ID=9:a9b000055d49b45e11db8b8bdc1aadc2',
Блокировка по ссылке и наименованию при записи элемента справочника:
Regions=Reference9.REFLOCK,
Locks='Reference9.REFLOCK Exclusive Description="Малый" ID=9:a9b000055d49b45e11db8b8bdc1aadc2