Ошибка удаления Mnesia

Я использую таблицу мнезии. Эта таблица имеет два атрибута (первичный ключ и его значение). Теперь я пытаюсь удалить кортеж из таблицы мнезии. Я использую функцию удаления / 1 мнезии для целей удаления. Эта функция принимает имя таблицы и ключ, соответствующий кортежу, для которого необходимо произвести удаление. Моя проблема в том, как я могу справиться с этим. сценарий, когда отсутствует кортеж, соответствующий переданному ключу. Эта функция удаления каждый раз выдает {atomic, ok}?


person Geek    schedule 23.09.2015    source источник


Ответы (1)


В вашем случае вы должны сначала прочитать запись и только после этого удалить ее. Чтобы предотвратить доступ к записи из других транзакций между операциями «чтение» и «удаление», используйте вид блокировки «запись» при чтении записи. Это дает вашей транзакции эксклюзивный доступ к ней:

delete_record(Table, Key) ->
    F = fun () ->
            case mnesia:read(Table, Key, write) of
                [Record] ->
                    mnesia:delete({Table, Key}),
                    {ok, Record};
                [] ->
                    mnesia:abort(not_exist)
            end
        end,
    mnesia:transaction(F).
person Danil Onishchenko    schedule 23.09.2015
comment
Нет ли другой альтернативы?. Значит, существует ли какая-то функция удаления, которая может зафиксировать эту проблему? - person Geek; 23.09.2015
comment
Насколько я знаю, нет. - person Danil Onishchenko; 23.09.2015