1

2 つのテーブルが関連付けられており、これら 2 つのテーブルのすべてのレコードを削除する関数を書きたいのですが、出力ではそれができないことが示されています。レコードを 1 つずつ削除するという効率の低い選択肢しかありませんか?

clear_gyne()->
R = execute_mnesia_transaction(
 fun()->
    mnesia:clear_table(bas_gyne),
    mnesia:clear_table(bas_gyne_property)
end),
R.

execute_mnesia_transaction(TxFun) ->
    %% Making this a sync_transaction allows us to use dirty_read
    %% elsewhere and get a consistent result even when that read
    %% executes on a different node.
    %%    case worker_pool:submit(
    %%    fun () ->
    Result_a = case mnesia:is_transaction() of
                         false -> DiskLogBefore = mnesia_dumper:get_log_writes(),
                                  Res = mnesia:sync_transaction(TxFun),
                                                     DiskLogAfter  = mnesia_dumper:get_log_writes(),
                                  case DiskLogAfter == DiskLogBefore of
                                      true  -> Res;
                                      false -> {sync, Res}
                                  end;
                         true  -> mnesia:sync_transaction(TxFun)
                     end,
    case Result_a of
        {sync, {atomic,  Result}} -> mnesia_sync:sync(), Result;
        {sync, {aborted, Reason}} -> throw({error, Reason});
        {atomic,  Result}         -> Result;
        {aborted, Reason}         -> throw({error, Reason})
   end.

execute_mnesia_transactionrabbitmq プロジェクトのソース コードからコピーされます。

出力は

bas_store:clear_gyne().
** exception throw: {error,{aborted,nested_transaction}}
     in function  bas_store:execute_mnesia_transaction/1 (src/bas_store.erl, line 29)
4

1 に答える 1

1

mnesia:clear_table/1スキーマ トランザクションに分類されるため、別のトランザクションにネストすることはできません。

参照。mnesia:clear_table http://erlang.org/pipermail/erlang-questions/2005-August/016582.html

于 2012-04-25T00:34:13.647 に答える