Mnesia возвращает {прервано, no_transaction}

У меня есть таблица Mnesia с именем person, использующая следующее определение записи:

-record(person, {id, firstname, lastname, phone}).

В таблице есть такие значения:

    12  alen     dumas      97888888
    13  franco   mocci      55522225
    14  ali      othmani    44444449

Я хочу получить последний идентификатор, который в моем случае 14.

Я пытаюсь с:

test()->
    Key=mnesia:last(person).

но когда я тестирую эту функцию, у меня возникает эта ошибка:

** exception exit: {aborted,no_transaction}
     in function  mnesia:abort/1

Это почему? Что я могу с этим поделать?


person nabil chouaib    schedule 20.02.2013    source источник
comment
Я думаю, что erlang содержит функцию, которая возвращает последний объект в той же таблице.   -  person nabil chouaib    schedule 20.02.2013
comment
mnesia:last/1 работает. Вы просто использовали его неправильно. Однако упорядоченность не является хорошей чертой мнезии. Возможно, вы не захотите полагаться на его порядок.   -  person Muzaaya Joshua    schedule 21.02.2013


Ответы (2)


Сообщение об ошибке exception exit: {aborted,no_transaction} совершенно ясно: ожидается, что функция будет вызываться в контексте транзакции, а ваш код — нет. Если вам не нужна транзакция, вы можете вместо нее использовать mnesia:dirty_last/1. Обратите внимание, что и mnesia:last/1, и mnesia:dirty_last/1 имеют смысл, если тип таблицы — order_set. Для других типов явный порядок не определен.

person ppolv    schedule 20.02.2013

Ppolv дает ключ к разгадке проблемы: вам нужно вызывать функции мнезии в контексте транзакции, то есть в контексте доступа к активности мнезии. Не проверял, но что-то вроде этого должно работать:

test()->
      Getlastperson = fun() -> Key=mnesia:last(person) end,
      mnesia:activity(transaction, Getlastperson).   
person DavidH    schedule 15.11.2014