vk fb tw rss

Анатомия платформы. Структура хранения констант

Устройство таблицы констант

 

Продолжаем препарировать платформу, на этот раз подвергнем тщательному анализу механизм работы констант.
Казалось бы, что может быть проще констант, на первый взгляд это самый простой и примитивный объект метаданных. Но незнание внутреннего устройства этого объекта метаданных, может привести к очень печальным последствиям, например, полностью свести на нет параллельное проведение документов.

 

Для нас, людей, все постоянно — до тех пор, пока не изменится.

 

 

Устройство таблицы констант различается в разных версиях платформы, а именно до версии 8.2.14, все константы хранились в одной таблице. В версии 8.2.14 и выше каждая константа хранится в отдельной таблице.

Разберем отдельно примеры для версий до и после 8.2.14.

До версии 8.2.14

В качестве теста используется платформа версии 8.2.18.102, но с включенным режимом совместимости с 8.2.13.

Режим совместимости

В этом случае объекты метаданных на уровне СУБД буду храниться точно так же, как если бы использовалась платформа 8.2.13

Создадим в конфигурации 3 константы с типами Число, Строка, и Дата соответственно.

3 константы

 

Сохраним конфигурацию и заполним константы значениями.

Заполненные константы

Константы хранятся в таблице «_Consts», давайте посмотрим структуру этой таблицы на уровне СУБД.

Структура констант

Для каждой константы создается отдельный столбец, т.е. все константы хранятся вместе в одной таблице в разных колонках.

Столбец «_RecordKey» является служебным, это своеобразный ключ или идентификатор записи, он необходим для установки транзакционной блокировки.

Выполним запрос к таблице констант

Запрос к константам

В таблице констант всегда присутствует только одна строка. Если мы добавим новую константу, то у нас только добавиться новый столбец, но строка все равно будет только одна.

Казалось бы, ничего страшного в таком способе хранения нет, но на самом деле у данной архитектуры есть один недостаток.

Допустим, пользователь 1 читает в транзакции значение константы №1, в то же время пользователь 2 хочет изменить значение константы №2. Но второй пользователь не сможет ничего поменять и встанет в очередь, т.к. хоть константы и разные, но они хранятся в одной строке таблицы, и пользователь 1 уже заблокировал эту строку. Строка это минимальный объем  который может быть заблокирован, мы не можем заблокировать только один столбец одной строки.

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

 


Начиная с версии 8.2.14 и выше

Если использовать платформу 8.2.14 или выше, то каждая константа будет храниться в своей таблице.

Уберем режим совместимости и сохраним конфигурацию.

Без совместимость

Давайте посмотрим, как измениться структура базы данных на уровне СУБД

Структура после 8.2.14

Таблица Const исчезла, и вместо нее появилось 3 отдельных таблицы.

Теперь для каждой константы у нас есть отдельная таблица, следовательно, менять разные константы мы можем одновременно, т.е. параллельность работы значительно повышается.

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

Константы, это объект метаданных не предназначенный для хранения часто меняющейся информации, а как раз наоборот, для хранения редко меняющихся данных. Именно этим и обусловлена такая структура констант.

Тем не менее, разработчики часто используют константы не по назначению, например делают из них счетчики документов:

Константы.СчетчикДокументов.Установить(Константы.СчетчикДокументов.Получить()+1);

Если этот код написать в модуле проведения документов, то у вас ни один документ не сможет проводиться параллельно, даже если документы никак не пересекаются по данным. Для них узким место будет запись константы, т.к. параллельно изменить одни и те же данные нельзя.

Помимо прочего, отсюда следует еще один вывод.

Не желательно использовать режим совместимости со старыми версиями, таким образом вы существенно ограничиваете потенциал платформы, и не используете новые возможности, которые призваны повысить скорость и параллельность работы пользователей.

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

 

Понравилась статья? Подпишись на новости!



Лучшие материалы по теме

Расскажите своим друзьям
Вам ничего не стоит, а им будет интересно
Подпишитесь на обновления
Ваш e-mail: * Ваше имя: *


Обсудить Вконтакте


Обсудить в Facebook

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *