В чем разница между таблицей 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, если таковые имеются. Репликация не будет.