Muz*_*hua 5 erlang transactions mnesia
我创建了一个名称与其记录名称不同的表.以下是代码段
%% ---- record definition -------------------------------- -record(object,{key,value}).在这样做的过程中,mnesia大声呼喊.该表的建立是非常好,并且可以在观看
%% ---- create table ------------------------------------- {atomic,ok} = mnesia:create_table(mytable,[ {type,set}, {frag_properties,[ {node_pool,[node()]}, {n_fragments,4}, {n_disc_copies,1}]}, {attributes,record_info(fields,object)}] ),
%% ------- inserting --------------------------------
insert()-> F = fun() -> R = #object{ key = "MyKey", value = "Value" }, mnesia:write(mytable,R,write) end, mnesia:activity(transaction,F,[],mnesia_frag).
tv:start().
或mnesia:info().
.这是我在shell上看到的错误.** exception exit: {aborted, {bad_type, #object{ key = "MyKey", value = "Value"}}} in function mnesia:wrap_trans/6 (mnesia.erl, line 395)现在,通常,我认为当创建表时使用的记录定义与插入表中的记录结构不同时,会出现这样的错误.我想知道这只是我正在使用的函数的一个问题,即:
mnesia:write/3
当表名与记录名不同时,这会有所帮助.mnesia:write/3
,记录将正确插入表中.但是我的应用程序需求是这样的,我将创建几个不同的表,但它们存储相同的记录结构/定义.我想拥有不同的表,但它们的record_info
定义是相同的.Erlang otp R15B, mnesia-4.6 , windows 7 enterprise, 32-bit operating system, Dell laptop, intel core i5, 4GB RAM
我正在处理的所有其他erlang项目都很好,它们没有像这样的奇怪/意外行为.Isa*_*sac 10
您必须{record_name, object}
在创建表时使用该属性.例如
{atomic,ok} = mnesia:create_table(mytable,[
{type,set},
{frag_properties,[
{node_pool,[node()]},
{n_fragments,4},
{n_disc_copies,1}]},
{record_name, object},
{attributes,record_info(fields,object)}]
),
Run Code Online (Sandbox Code Playgroud)
来自文档:
{record_name,Name},其中Name必须是一个原子.存储在表中的所有记录都必须将此名称作为第一个元素.它默认使用与表名相同的名称.