По тексту берется следующий идентификатор
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, но и неоткатываемая операция.
Комментариев нет:
Отправить комментарий