Mnesia异常退出:{aborted,{bad_type,Record}}

时间:2012-05-16 15:30:44

标签: transactions erlang mnesia

我创建了一个名称与其记录名称不同的表。以下是代码段

%% ---- record definition --------------------------------
-record(object,{key,value}).
%% ---- 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).
在这样做的过程中,mnesia大声呼喊。该表格创建得非常好,可以在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项目都很好,它们没有像这样的奇怪/意外行为。
有什么建议吗?

< / p>

1 个答案:

答案 0 :(得分:9)

创建表时必须使用{record_name, object}属性。 e.g。

{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)}]
            ),

来自docs

  

{record_name,Name},其中Name必须是原子。存储在表中的所有记录都必须将此名称作为第一个元素。它默认使用与表名相同的名称。