[erlang-questions] (not) understanding mnesia transactions

Seth Falcon <>
Thu Jun 18 07:34:59 CEST 2009


Chandru,

Thanks for the explanation.

* On 2009-06-17 at 23:57 +0100 Chandru wrote:
> Your code works as you expect it to if you first acquire a write
> lock on the table before you read from it.

Yes, that seems to fix it.

> So all your clients acquire read locks, decide that a record for a URL does
> not exist, and create a record. I'm not sure what locks are acquired for
> records which do not exist. I'm sure the answer lies in reading the mnesia
> source code...

Makes some sense.  I guess the big piece that I was missing is that
transactions can run concurrently and the programmer needs to manage
the locking.  A more subtle point, is that the locking mechanism is
such that once a lock is aquired it is kept for the remainder of the
transaction (I think).

So in the following example from the mnesia man page, the call to
mnesia:wread has the same effect as calling mnesia:lock and then
mnesia:read.

   raise(Name, Amount) ->
                  mnesia:transaction(fun() ->
                      case mnesia:wread({person, Name}) of
                          [P] ->
                              Salary = Amount + P#person.salary,
                              P2 = P#person{salary = Salary},
                              mnesia:write(P2);
                          _ ->
                              mnesia:abort("No such person")
                      end
                  end).



More information about the erlang-questions mailing list