пятница, 6 апреля 2018 г.

Неполнота транзакционности битовых индексов в Cache и MiniM

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

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

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

s $bit(^bitdata,123)=0

tstart

                              tstart

s $bit(^bitdata,123)=1

                              s $bit(^bitdata,123)=1

trollback

                              tcommit

w $bit(^bitdata,123),!
Здесь оба процесса выполняют обращение к одному и тому же биту, и оба начинают транзакцию в состоянии нулевого бита. Оба прописывают единицу. Но первый выполняет откат, и считает что должен остаться ноль, а второй процесс выполняет коммит и считает что должна остаться единица.

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

В результате база перешла в корректное с точки первого процесса состояние, но некорректное с точки зрения второго.

Для решения этой проблемы необходимо, чтобы оба процесса проходили через выполнение явной блокировки, живущей до окончания транзакции, с одинаковым именем. Хотя бы к примеру через имя в котором записывается корень самого индексируемого объекта. Если это условие выполняется, то оба процесса корректно пройдут через операции отката и коммита.

Комментариев нет:

Отправить комментарий