Каталог решений - Блокировка данных при выполнении запроса в транзакции

Блокировка данных при выполнении запроса в транзакции

Блокировка данных при выполнении запроса в транзакции

В наличии

При подготовке к аттестации "1С:Эксперт по технологическим вопросам" возник ряд вопросов по блокировке объектов при выполнении запроса в транзакции в автоматическом режиме управления блокировкой данных. В частности возник вопрос, а правда ли что при запросе в транзакции блокируются не только возвращаемые данные, но возможно, и вся таблица если идет ее просмотр. Кому интересны мои эксперименты прошу под кат.

Категория:

Описание

Для проведения экспериментов создаем в базе справочник «Товары» с реквизитами «РеквизитИндексированный» по которому создан индекс и «РеквизитНеИндексированный» по которому соответственно индекса нет.

 

После чего заполняем данные для проведения эксперимента.

   

Наименование

Реквизит не индексирован

Реквизит индексированный

 

Кресло мягкое

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, в котором блокируются граничные записи, опытным путем установленно, что блокируется только нижняя граничная запись.


Выводы: При запросе к регистру возможна блокировка всей таблицы регистра, если в плане запроса используется сканирование, либо блокировка конкретных строк, если используется поиск по индексу. При запросе к документу или справочнику возможна либо блокировка строки, когда невозможно изменение любого реквизита, если используется кластерный индекс, либо блокировка поля объекта, если используется поиск или сканирование обычного индекса. 

has been added to your cart:
Оформление заказа