Для проведения экспериментов создаем в базе справочник "Товары" с реквизитами "РеквизитИндексированный" по которому создан индекс и "РеквизитНеИндексированный" по которому соответственно индекса нет.
После чего заполняем данные для проведения эксперимента.
Наименование |
Реквизит не индексирован |
Реквизит индексированный |
|
Кресло мягкое |
2 |
2 |
|
Стул 999 |
3 |
1 |
|
Товар 0 |
2 |
2 |
|
Товар 0 |
2 |
1 |
|
Товар 00 |
3 |
2 |
|
Товар 00 |
3 |
1 |
|
Товар 10 (изменено) |
1 |
2 |
|
Товар 102 |
0 |
0 |
|
Товар 103 |
0 |
0 |
|
Товар 104 |
0 |
0 |
|
Далее запускаем на выполнение данный код, поставив точку останова на строке ЗафиксироватьТранзакцию()
Запрос выполняется по следующему плану
В паралельной сессии начнем эксперементировать, для начала проверим блокируется ли вся таблица. Для этого открываем элемент у которого оба реквизита не равны 2, например "Стул 999", пытаемся изменить его в различных вариантах, ошибок блокировки объекта нет. Значит таблица не блокируется полностью.
Далее, пытаемся изменить элемент у которого РеквизитИндексированный равен 2, РеквизитНеИндексированный НЕ равен 2, т.е. элемент по которому был поиск по индексу, но не было поиска ключа по кластерному индексу, например "Товар 10 (изменено)". Система дает нам изменить любой реквизит кроме того, по которому осуществлялся поиск в индексе. Можно изменить наименование, код, все кроме "РеквизитИндексированный"
Ну и наконец берем элемент по которому был кластерный поиск, т.е. у которого оба реквизита равны 2, подойдет "Кресло мягкое", в этом элементе невозможно изменить какой-либо реквизит, строка таблицы заблокирована полностью.
В итоге получилась вот такая таблица:
Вид объекта |
Оператор плана запроса |
Блокировка данных с граничными строками?* |
Блокировка строки или всей таблицы? |
Блокируется строка либо поле? |
Регистр сведений |
Index Seek |
Да |
Строка |
Строка |
Регистр сведений |
Clustered Index Seek |
Да |
Строка |
Строка |
Регистр сведений |
Index Scan |
|
Таблица |
Строка |
Регистр сведений |
Clustered Index Scan |
|
Таблица |
Строка |
Справочник |
Index Seek |
Нет |
Строка |
Поле |
Справочник |
Clustered Index Seek |
Нет |
Строка |
Строка |
Справочник |
Index Scan |
Нет |
Строка |
Поле |
Справочник |
Clustered Index Scan |
Нет |
Строка |
Строка |
*При блокировке не объектных данных в автоматическом режиме используется уровень изоляции SERIALIZABLE, в котором блокируются граничные записи, опытным путем установленно, что блокируется только нижняя граничная запись.
Выводы: При запросе к регистру возможна блокировка всей таблицы регистра, если в плане запроса используется сканирование, либо блокировка конкретных строк, если используется поиск по индексу. При запросе к документу или справочнику возможна либо блокировка строки, когда невозможно изменение любого реквизита, если используется кластерный индекс, либо блокировка поля объекта, если используется поиск или сканирование обычного индекса.