【问题标题】:Mnesia returns {aborted, no_transaction}Mnesia 返回 {aborted, no_transaction}
【发布时间】:2013-02-05 18:00:19
【问题描述】:

我有一个名为 person 的 Mnesia 表,使用以下记录定义:

-record(person, {id, firstname, lastname, phone}).

该表包含以下值:

    12  alen     dumas      97888888
    13  franco   mocci      55522225
    14  ali      othmani    44444449

我想检索最后一个 id,在我的例子中是 14

我尝试:

test()->
    Key=mnesia:last(person).

但是当我测试这个函数时我有这个错误:

** exception exit: {aborted,no_transaction}
     in function  mnesia:abort/1

这是为什么呢?我该怎么办?

【问题讨论】:

  • 我认为erlang包含一个返回同一个表中最后一个对象的函数
  • mnesia:last/1 有效。你只是用错了。但是,排序并不是 mnesia 的一个好特性。您可能不想依赖它的顺序。

标签: erlang mnesia


【解决方案1】:

错误消息exception exit: {aborted,no_transaction} 非常清楚:该函数应在事务上下文中调用,而您的代码不是。 如果您不需要事务,则可以使用 mnesia:dirty_last/1 代替。 请注意,如果表类型为 ordered_set,则 mnesia:last/1 和 mnesia:dirty_last/1 都有意义。对于其他类型,没有明确定义顺序。

【讨论】:

    【解决方案2】:

    Ppolv 给出了问题的线索:您需要在事务的上下文中调用 mnesia 函数,即 mnesia '活动访问上下文'。没有测试过,但这样的东西应该可以工作:

    test()->
          Getlastperson = fun() -> Key=mnesia:last(person) end,
          mnesia:activity(transaction, Getlastperson).   
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2019-06-04
      • 2012-10-11
      • 2023-03-30
      • 2011-05-04
      • 2011-03-04
      • 1970-01-01
      • 2010-10-13
      相关资源
      最近更新 更多