В чем разница между таблицей ets `public` `named` и таблицей mnesia `local` и`ram_copy`

Я создаю таблицу мнезий, например

mnesia:create_table(mytable, [{ram_copies, node()}, {local_content,true}], 
                              {attributes, [col1,col2]}]).

Так как local_content=true, так что он не может обмениваться данными с другими узлами, и это ram_copies Таблица.

Я считаю, что могу сделать то же самое с таблицей ets, как показано ниже.

ets:new(mytable,[named_table, public]).

Я думаю, с точки зрения производительности, они похожи.

Мне интересно, каковы различия между этими двумя таблицами, с точки зрения семантики?

1 ответ

Решение

Таблица является серверной для хранилища. Разница заключается в обработке транзакций, поддерживаемых Mnesia, но не ETS.

Фактически обработка транзакций в Mnesia зависит от используемого контекста транзакции:

  • transaction: запустить серию операций с базой данных как единый функциональный блок. Весь блок будет работать на всех узлах или ни на одном из них; это полностью или неудачно. Этот тип контекста активности является частично асинхронным: он будет синхронным для операций на локальном узле, но он будет только ждать подтверждения от других узлов, что они совершат транзакцию, а не того, что они это сделали.
  • sync_transaction: почти так же, как transaction, но это синхронно на всех узлах.
  • async_dirty: обходит все протоколы транзакций и действия по блокировке (имейте в виду, что он будет ожидать завершения активных транзакций, прежде чем продолжить)
  • sync_dirty: будет ждать подтверждения того, что на удаленных узлах все в порядке, но все равно останется вне контекста блокировки или транзакции.
  • ets: в основном способ обойти все, что делает Mnesia, и выполнять ряд необработанных операций с базовыми таблицами ETS, если таковые имеются. Репликация не будет.
Другие вопросы по тегам