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

28.12.14

Разработка - Математика и алгоритмы

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


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

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3165    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7556    user1959478    51    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3111    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    10905    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4361    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

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

23.11.2022    3531    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9042    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. asved.ru 36 31.12.14 11:08 Сейчас в теме
Что-то я не понял, о чем Вы хотите рассказать. Блокируются данные в той таблице, из которой были прочитаны. Т.е. если происходит clustered index seek - блокируются строки таблицы кластерного индекса, т.е. по сути своей строки основной таблицы. Если делается seek по некластерному индексу - блокируются его строки, соответственно, когда мы изменяем индексированный реквизит, мы пытаемся обновить индекс по этому реквизиту, а он блокирован. Блокировки же поля строки вообще не бывает. На основании чего в таблице указаны накладываемые при различных scan блокировки - вообще не понятно, нет у вас сканов в плане запроса.

Кстати, а чем table scan отличается от clustered index scan, Вы разобрались?
Evil Beaver; alexscamp; Redokov; zzz14; +4 Ответить
10. Agamest 37 03.01.15 18:26 Сейчас в теме
(1) asved.ru,

Что-то я не понял, о чем Вы хотите рассказать. Блокируются данные в той таблице, из которой были прочитаны. Т.е. если происходит clustered index seek - блокируются строки таблицы кластерного индекса, т.е. по сути своей строки основной таблицы. Если делается seek по некластерному индексу - блокируются его строки, соответственно, когда мы изменяем индексированный реквизит, мы пытаемся обновить индекс по этому реквизиту, а он блокирован.

Примерно вот это я и хотел сказать, в зависимости от того что именно читается и как, может блокироваться либо вся таблица, либо "строка"(если смотреть на метаданные 1С) таблицы, либо "поле" (опять же если смотреть на метаданные 1С) таблицы

На основании чего в таблице указаны накладываемые при различных scan блокировки - вообще не понятно, нет у вас сканов в плане запроса.

Я не стал приводить все этапы тестирования, например для регистров, это итоговая таблица.

Кстати, а чем table scan отличается от clustered index scan, Вы разобрались?

В одном случае идет просмотр кластерного индекса, в другом таблицы? Нет?
12. asved.ru 36 09.01.15 16:09 Сейчас в теме
(10) Agamest,
либо "поле" (опять же если смотреть на метаданные 1С) таблицы

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

В одном случае идет просмотр кластерного индекса, в другом таблицы? Нет?

Логично. Но возникает вопрос: а кластерный индекс - это таблица или нет? И что такое просмотр? Не забываем про существование оператора seek ... where.

Да, вы правы, прошел недавно этот курс

Благодарю, сделал определенные выводы.
13. Agamest 37 09.01.15 19:36 Сейчас в теме
(12) asved.ru,

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

Спасибо за поправку, буду знать что на экзамене нельзя абстрагироваться от понятий БД

Логично. Но возникает вопрос: а кластерный индекс - это таблица или нет? И что такое просмотр? Не забываем про существование оператора seek ... where.

Кластерный индекс на уровне листьев хранит данные, таблица включена в индекс. Соответственно просмотр кластерного индекса это просмотр его листьев. При seek where мы переходим с помощью seek на определенный уровень дерева, после чего просматриваем его листья и сравниваем с where. Я не прав?
Seneka7608; +1 Ответить
14. asved.ru 36 10.01.15 20:15 Сейчас в теме
(13) Agamest, абстрагироваться от понятий БД можно и нужно, если речь идет о процессе, протекающем выше уровня БД, к примеру, об управляемых блокировках. Но - при разборе управляемых блокировок и ожиданий на них нельзя забывать и о том, что они в любом случае сопровождаются блокировками СУБД согласно уровню изоляции транзакции.

Вот есть у нас непериодический регистр сведений, три измерения, несколько неиндексированных ресурсов. В запросе накладывается условие
1) на второе измерение
2) На первое, третье измерения и ресурс

Поставьте эксперимент, какими операторами в данных случаях будет выполняться чтение. Рассмотрите случаи с небольшим и значительным количеством записей. Ну и с различной селективностью по заданному условию.
Seneka7608; +1 Ответить
2. Babuin 31.12.14 11:30 Сейчас в теме
да статья невнятная, плюс не указана структура индекса, плюс не показано какие блокировки и как накладываются и выводы неверные как уже сказали нет блокировки поля, есть блокировки строк или страниц, ключей диапазонов и таблиц.
3. zzz14 24 31.12.14 12:30 Сейчас в теме
> блокируется только нижняя граничная запись.
Лучше об этом прочитать в документации.
MSDN: Число установленных блокировок Range равно n+1, где n — это число строк, удовлетворяющих запросу. Подробнее.

Вы участник курса по опимизации 1С?
5. DoctorRoza 31.12.14 12:36 Сейчас в теме
(3) zzz14, однозначно, да! Этот курс хорош, но его еще нужно переосмыслить!
11. Agamest 37 03.01.15 18:33 Сейчас в теме
(3) zzz14,
Спасибо за ссылку, прочту. Да, вы правы, прошел недавно этот курс.
4. DoctorRoza 31.12.14 12:34 Сейчас в теме
При подготовке к аттестации "1С:Эксперт по технологическим вопросам" возник ряд вопросов по блокировке объектов при выполнении запроса в транзакции в автоматическом режиме управления блокировкой данных.


Вам нужно еще раз внимательно пересмотреть курс. Андрей Бурмистров четко говорит, что в автоматическом режиме блокировок всегда блокируется вся таблица, в управляемом - только нужные записи.
6. Babuin 31.12.14 12:56 Сейчас в теме
(4) DoctorRoza, это не так. Гранулярность блокировок в MS SQL не зависит от режима управления блокировок в 1С.
7. zzz14 24 31.12.14 14:58 Сейчас в теме
(4) DoctorRoza,

Андрей Бурмистров этого не говорил.
8. asved.ru 36 01.01.15 16:27 Сейчас в теме
(4) DoctorRoza, вероятно, Андрей говорит про Postgre или файловую БД. Ибо табличная блокировка в MSSQL - однозначно объект для разбирательства даже в режиме автоблокировок.

(3) zzz14, по большому счету это уже непринципиально, т.к. блокировка области в любом случае скорее всего избыточна. И стало практически неважным с появлением режима управляемых блокировок, когда транзакция осуществляется в read_committed. Безусловно, можно говорить о том, что блокировка существует, пока в транзакции выполняется долгий запрос, но долгий запрос, да еще и с избыточными блокировками - сам по себе объект для разбирательства.
9. ineshyk 03.01.15 00:59 Сейчас в теме
(4) DoctorRoza, да бред.
Это не верно.
Автоматический режим отличается только уровнем изоляции.
Грянулярность тут ни при чем.
15. Sergey.Noskov 1406 19.01.15 13:45 Сейчас в теме
Блокировку таблицы справочника целиком можно наблюдать при эскалации блокировок.
Для этого достаточно, что бы в операторе "Поиск ключа" (Key Lookup) было обработано более 5000 строк индекса (параметр настраиваемый). Думаю именно этот эффект вы на регистрах сведений и наблюдали.
16. asved.ru 36 27.01.15 20:33 Сейчас в теме
(15) Sergey.Noskov, вы все еще не отключаете эскалацию по количеству? Тогда мы идем к вам! ;)
Оставьте свое сообщение