Особенности блокировки таблиц последовательности документов

Работу с последовательностью документов можно разделить на три независимых процесса – регистрация документа в последовательности, передвижение границы последовательности вперед, передвижение границы последовательности назад. Каждый из процессов по-своему влияет на блокировку записей последовательности документов.

Последовательность документов состоит из двух таблиц данных. Одна таблица содержит записи регистрации документов в последовательности, вторая таблица содержит границы последовательностей в разрезе измерений последовательности. Каждая таблица по-разному используется и, соответственно, по-разному блокируется во всех этих трех процессах.

Блокируемые диапазоны записей описываются для варианта клиент-сервер. В варианте файл-сервер блокируется не диапазон записей, а вся таблица целиком. Для клиент-серверного варианта диапазон заблокированных записей может быть значительно больше описанного, так как SQL-сервер может изменить гранулярность блокировки исходя из собственных данных по оптимальному исполнению запросов.

Регистрация документа в последовательности

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

Перемещение границы последовательности вперед

Перемещение границы последовательности вперед происходит только при проведении документа. Процесс перемещения границы вперед состоит из следующих операций:

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

В результате этих действий оказывается заблокирована и таблица регистрации, и таблица границ. Таблица регистрации заблокирована в диапазоне от границы последовательности по момент времени регистрации документа в последовательности. Таблица границ будет заблокирована от изменения границы, независимо от того раньше она момента регистрации документа или позже, так как ее чтение осуществляется с блокировкой для последующего обновления (FOR UPDATE).
Если у последовательности есть измерения, то заблокированы будут только записи и границы последовательности со значениями измерений, совпадающими со значениями измерений записей регистрации.

Например, в конфигурации есть  последовательность документов "ПартионныйУчет" с одним измерением "Товар", в которой регистрируются документы "РасходнаяНакладная". В таблице границ последовательности существуют три границы со следующими значениями измерений "Стол", "Стул" и "Диван". Допустим, записывается и проводится документ, который осуществил регистрацию по двум товарам: "Стул" и "Диван". Тогда в таблице границ последовательности будут заблокированы 2 записи со значением измерения "Товар" равным "Стул" и "Диван".

Перемещение границы последовательности назад

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

  1. Поверяется, что граница последовательности больше момента времени записи регистра.
  2. Предвигается граница последовательности на момент времени записи регистра.

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