[erlang-questions] Interesting behavior of mnesia:transaction/1

Joel Reymont <>
Wed Jul 4 14:04:39 CEST 2007


Folks,

I'm running two processes that both write to the same Mnesia table to  
update the same object. Each process runs this code:

%%% Fetch record, bump counter, store

bump(Parent, _, _, 0) ->
     Parent ! {done, self()},
     ok;

bump(Parent, Cache, K, N) ->
     F = fun() ->
                 {ok, _, L} = cache:fetch(Cache, K),
                 V = binary_to_term(list_to_binary(L)),
                 V1 = V + 1,
                 L1 = binary_to_list(term_to_binary(V1)),
                 X = cache:store(Cache, K, L1, "", "text/plain"),
                 {V1, X}
         end,
     cache:transaction(F),
     erlang:yield(),
     bump(Parent, Cache, K, N - 1).

where cache:transaction/1 is just a wrapper around mnesia:transaction/1.

I put a delay of 200ms into cache:store/5 and start process #2 with a  
100ms delay.

I was expecting to see processes take turns but instead I'm seeing  
each process run twice. Is there any explanation for this?

bump <0.904.0>: V = ok, Result = 1
bump <0.904.0>: V = ok, Result = 2
bump <0.905.0>: V = ok, Result = 3
bump <0.905.0>: V = ok, Result = 4
bump <0.904.0>: V = ok, Result = 5
bump <0.904.0>: V = ok, Result = 6
bump <0.905.0>: V = ok, Result = 7
bump <0.905.0>: V = ok, Result = 8
bump <0.904.0>: V = ok, Result = 9
bump <0.904.0>: V = ok, Result = 10
bump <0.905.0>: V = ok, Result = 11
bump <0.905.0>: V = ok, Result = 12

	Thanks, Joel

--
http://topdog.cc      - EasyLanguage to C# compiler
http://wagerlabs.com  - Blog








More information about the erlang-questions mailing list