понедельник, 10 апреля 2023 г.

В чем тут проблема?

На сайте о М системах https://mumps.dev приведены скриншоты с текстом на языке М.
В чем там может быть проблема?

По тексту берется следующий идентификатор
 lock +^carId
 set id=$increment(^carId)
 lock -^carId
Здесь инкрементная блокировка ставится на имя с глобалом с идентификатором. После чего берется следующее значение через функцию $increment. Обращение за следующим идентификатором выполняется в старом стиле, через блокировки.

Но для выполнения функции $increment блокировки не требуются, она самостоятельно препятствует изменению именно блокируемого имени (но не дочерних в отличие от lock) другими процессами. Если там не было значения или оно было строковым то будет считаться что был ноль и функция вернет 1.

Если же выполнять код в старом стиле целиком, то нужно
 lock +^carId
 set ^carId=$get(^carId)+1 
 set id=^carId
 lock -^carId
В чем отличие этих двух методов? Кроме блокирования самого имени, выполняется автоматически и блокирования всех вложенных имен. Но это не слишком важно обычно.

Если используемая система поддерживает $increment, то блокировка не требуется. Ключевое же отличие в транзакционном механизме с журналированием.

А именно что происходит при откате транзации. В старом варианте значение ^carId при откате транзакции по журналу будет восстановлено в значение до его увеличения, а в новом - будет оставлено в новом значении ($increment в журнале отличается от set).

Но при восстановлении из бекапа М система донакатит по журналу все проведенные (после сохранения в бекап данных) операции и установит, уже по журналу, новое значение, полученное последним.

В настоящее время (первая половина 2023) есть реализация М, это RSM, в которой есть функция $increment, но нет транзакций с откатом. В остальных же $increment это не только арифметика + side effect, но и неоткатываемая операция.

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

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