Несмотря на желание производителей M-систем иметь транзакционность битовых индексов, и на все прикладываемые усилия, физику предмета им преодолеть пока не удалось.
Попробуем разобраться.
При выполнении простановки бита прямое блокирование используемой переменной не требуется. Если бы требовалось, то при выполнении такой команды в контексте транзакции блокировка ожидала бы окончания транзакции, что могло бы приводить к дедлокам. В случае, если несколько процессов обращаются к разным битам, конфликтов нет и они проставляют разные биты. В отношении битовых индексов эта ситуация соответствует операциям с разными объектами, если позицию бита считать идентификатором объекта.
В случае если два (или более) процессов обращаются к одним и тем же битам, то ситуация уже плохая. Рассмотрим поведение серверов на примере двух процессов, выполняющих команды в указанной последовательности:
Поскольку обе системы ориентированы на откат по журналу, то при выполнении отката первого процесса он выполняется, а при выполнении коммита второго ничего не делается.
В результате база перешла в корректное с точки первого процесса состояние, но некорректное с точки зрения второго.
Для решения этой проблемы необходимо, чтобы оба процесса проходили через выполнение явной блокировки, живущей до окончания транзакции, с одинаковым именем. Хотя бы к примеру через имя в котором записывается корень самого индексируемого объекта. Если это условие выполняется, то оба процесса корректно пройдут через операции отката и коммита.
При выполнении простановки бита прямое блокирование используемой переменной не требуется. Если бы требовалось, то при выполнении такой команды в контексте транзакции блокировка ожидала бы окончания транзакции, что могло бы приводить к дедлокам. В случае, если несколько процессов обращаются к разным битам, конфликтов нет и они проставляют разные биты. В отношении битовых индексов эта ситуация соответствует операциям с разными объектами, если позицию бита считать идентификатором объекта.
В случае если два (или более) процессов обращаются к одним и тем же битам, то ситуация уже плохая. Рассмотрим поведение серверов на примере двух процессов, выполняющих команды в указанной последовательности:
первый процесс второй процесс s $bit(^bitdata,123)=0 tstart tstart s $bit(^bitdata,123)=1 s $bit(^bitdata,123)=1 trollback tcommit w $bit(^bitdata,123),!Здесь оба процесса выполняют обращение к одному и тому же биту, и оба начинают транзакцию в состоянии нулевого бита. Оба прописывают единицу. Но первый выполняет откат, и считает что должен остаться ноль, а второй процесс выполняет коммит и считает что должна остаться единица.
Поскольку обе системы ориентированы на откат по журналу, то при выполнении отката первого процесса он выполняется, а при выполнении коммита второго ничего не делается.
В результате база перешла в корректное с точки первого процесса состояние, но некорректное с точки зрения второго.
Для решения этой проблемы необходимо, чтобы оба процесса проходили через выполнение явной блокировки, живущей до окончания транзакции, с одинаковым именем. Хотя бы к примеру через имя в котором записывается корень самого индексируемого объекта. Если это условие выполняется, то оба процесса корректно пройдут через операции отката и коммита.
Комментариев нет:
Отправить комментарий